Seite 1 von 1
Tokenize list
Verfasst: Mittwoch 8. Dezember 2010, 17:08
von rockabilly1985
Hi ich wollte mal fragen wie ich das denn am besten anstelle.
Code: Alles auswählen
aS'-rw-r--r-- 1 u18540 u18540 300188701 Dec 3 05:26 xxxxxxxxxx.20101203.tar.gz'
p21
aS'-rw-r--r-- 1 u18540 u18540 297397107 Dec 4 05:26 xxxxxxxxxxxx.20101204.tar.gz'
p22
aS'-rw-r--r-- 1 u18540 u18540 259267054 Dec 5 05:25 xxxxxxxxxxxxxxx.20101205.tar.gz'
p23
aS'-rw-r--r-- 1 u18540 u18540 54409160110 Dec 6 08:49 xxxxxxxxxxxx.master.tar.gz'
p24
aS'-rw-r--r-- 1 u18540 u18540 33274200064 Dec 7 07:50 xxxxxxxxxx.20101207.master.tar.gz'
p25
aS'-rw-r--r-- 1 u18540 u18540 14067 Dec 3 05:26 xxxxxxxxxxxxx.20101203.tar.gz'
p26
aS'-rw-r--r-- 1 u18540 u18540 14054 Dec 4 05:26 xxxxxxxxxxxxxxx.20101204.tar.gz'
p27
ich will nur noch das hier:
oder
wie das evtl noch umwandeln in
??
damit ich das mit datetime verdingsen kann
Vielen Dank!
Mit dem tokenizen komm ich als blutiger Anfänger einfach nicht weiter.
Re: Tokenize list
Verfasst: Mittwoch 8. Dezember 2010, 17:36
von Hyperion
Ich würde da mal ins re-Modul gucken:
Code: Alles auswählen
In [25]: re.findall(r"Dec +\d", data)
Out[25]: [u'Dec 3', u'Dec 4', u'Dec 5', u'Dec 6', u'Dec 7', u'Dec 3', u'De
c 4']
Um das ganze dann in ein Datumsformat zu wandeln, könnte man wohl die Funktion "strptime(date_string, format)" aus dem datetime-Modul angucken.
Was noch fehlt ist ggf. das Einstellen der div. Monatsnamen (evtl. in einem Tupel, sollte es keine passenden Namen in den Locals des Interpreters geben).
Re: Tokenize list
Verfasst: Mittwoch 8. Dezember 2010, 18:30
von derdon
Dem Skript dann zum Testen die Anzahl der gewünschten Zeilen übergeben
Code: Alles auswählen
import sys
from pprint import pprint
def show_lines(data, number_of_lines=None):
new_data = data[::2]
return map(str.split, new_data)[:number_of_lines]
if __name__ == '__main__':
data = '''aS'-rw-r--r-- 1 u18540 u18540 300188701 Dec 3 05:26 xxxxxxxxxx.20101203.tar.gz'
p21
aS'-rw-r--r-- 1 u18540 u18540 297397107 Dec 4 05:26 xxxxxxxxxxxx.20101204.tar.gz'
p22
aS'-rw-r--r-- 1 u18540 u18540 259267054 Dec 5 05:25 xxxxxxxxxxxxxxx.20101205.tar.gz'
p23
aS'-rw-r--r-- 1 u18540 u18540 54409160110 Dec 6 08:49 xxxxxxxxxxxx.master.tar.gz'
p24
aS'-rw-r--r-- 1 u18540 u18540 33274200064 Dec 7 07:50 xxxxxxxxxx.20101207.master.tar.gz'
p25
aS'-rw-r--r-- 1 u18540 u18540 14067 Dec 3 05:26 xxxxxxxxxxxxx.20101203.tar.gz'
p26
aS'-rw-r--r-- 1 u18540 u18540 14054 Dec 4 05:26 xxxxxxxxxxxxxxx.20101204.tar.gz'
p27'''.splitlines()
num = int(sys.argv[1])
pprint(show_lines(data, num))
Re: Tokenize list
Verfasst: Mittwoch 8. Dezember 2010, 23:12
von rockabilly1985
OK Danke, soweit halbwegs verstanden.
Die Liste bekomme ich vom ftp server und hau die in ne Datei bzw Variable rein..... alles schon gemacht und funzt

....
so dann
kann/muss ich die datei bzw die Variable ja wieder lesen.
Code: Alles auswählen
import sys
from pprint import pprint
# HIER statt data dann die Variable??? :-D
def show_lines(data, number_of_lines=None):
# und hier
new_data = data[::2]
return map(str.split, new_data)[:number_of_lines]
if __name__ == '__main__':
merci
*hab ich nen HIRNSALAT sach ich euch ^^
Re: Tokenize list
Verfasst: Donnerstag 9. Dezember 2010, 01:38
von BlackJack
@rockabilly1985: Das sieht mir sehr stark nach einer `pickle`-Datei aus, also solltest Du die Daten auch mit dem `pickle`-Modul wieder einlesen, wenn sie damit geschrieben wurden. Oder alternativ nicht mit `pickle` in eine Datei schreiben wenn Du eigentlich die Textzeilen haben möchtest.
Re: Tokenize list
Verfasst: Donnerstag 9. Dezember 2010, 09:28
von rockabilly1985
Ja das ist mit pickle gemacht....mh wäre deiner Meinung nach was anderes besser geeignet. Hab mich da so durchgegooglet
ist Zustand:
Code: Alles auswählen
#!/usr/bin/python
import os
import sys
import datetime
import pickle
import time
from datetime import date, datetime
today = date.today()
print today
#Logindaten lesen
user = os.getenv("BM_UPLOAD_FTP_USER")
passwd = os.getenv("BM_UPLOAD_FTP_PASSWORD")
host = os.getenv("BM_UPLOAD_FTP_HOSTS")
#FTP login
from ftplib import FTP
ftp = FTP(host)
ftp.login (user, passwd)
print ftp.getwelcome()
lines = []
def add_line(line): lines.append(line)
ftp.retrlines('LIST', add_line)
datei = open("ftp-backup-check.txt", "w")
pickle.dump(lines, datei)
datei.close()
file = open("ftp-backup-check.txt", "r")
backup = pickle.load(file)
#from pprint import pprint
#def show_lines(backup, number_of_lines=None) :
# new_data = backup[::2]
# return map(str.split, new_data) [:number_of_lines]
#if __name__ == '__main__':
#????????? .splitlines()
# num = int(sys.argv[1])
# pprint(show_lines(data, num))
##print backup
file.close()
ftp.quit ()
VIELEN VIELEN DANK!
Re: Tokenize list
Verfasst: Donnerstag 9. Dezember 2010, 09:58
von BlackJack
@rockabilly1985: Pickle kannst Du ja benutzen, aber Deine Problembeschreibung sah so aus, als wenn Du die Datei dann beim Einlesen einfach als Textdatei aufmachst und dann versuchst daraus etwas zu extrahieren.
Pickle-Dateien muss man übrigens immer im Binärmodus öffnen wenn man Probleme beim einlesen über Plattformgrenzen hinweg vermeiden möchte.
Die `add_line()`-Funktion ist überflüssig -- man kann da auch gleich die `append()`-Methode von `lines` übergeben:
Re: Tokenize list
Verfasst: Donnerstag 9. Dezember 2010, 10:29
von rockabilly1985
So erste Hürde geschafft
Code: Alles auswählen
#!/usr/bin/python
import re
import os
import sys
import datetime
import pickle
import time
from datetime import date, datetime
today = date.today()
print today
#Logindaten lesen
user = os.getenv("BM_UPLOAD_FTP_USER")
passwd = os.getenv("BM_UPLOAD_FTP_PASSWORD")
host = os.getenv("BM_UPLOAD_FTP_HOSTS")
#FTP login
from ftplib import FTP
ftp = FTP(host)
ftp.login (user, passwd)
print ftp.getwelcome()
lines = []
def add_line(line): lines.append(line)
ftp.retrlines('LIST', add_line)
file_in = open("ftp-backup-check.txt", "w")
pickle.dump(lines, file_in)
file_in.close()
file_read = open("ftp-backup-check.txt", "r")
file_out = pickle.load(file_read)
dates = []
for line in lines:
m = re.search('\.(\d+)\.tar.gz', line)
if not m is None:
dates.append(m.group(1))
for date in dates:
print date
ftp.quit ()
gibt mir aus:
Code: Alles auswählen
2010-12-09
220 ProFTPD 1.3.3c Server (Hetzner Backup) [::ffff:188.40.2.171]
20101203
20101204
20101205
20101203
20101204
20101205
20101203
20101204
20101205
20101203
20101204
20101205
20101203
20101204
20101205
jetzt nur noch die in Inhalt in Variable date das Datumsformat ändern und schauen ob dateien von heute darin vorhanden sind.
Re: Tokenize list
Verfasst: Donnerstag 9. Dezember 2010, 10:38
von Hyperion
Es gibt hier spezielle Python-Code-tags. Wenn Du die für Quellcode benutzt wird er hübsch mit Syntax Highlighting versehen
Zum Code:
Ist mindestens umständlich:
ist einfacher und bewirkt das gleiche.
Dateien solltest Du mit dem with-Statement öffnen:
Code: Alles auswählen
with open(...) as handler:
handler.read() # oder was auch sonst
Du brauchst Dich dann um das Schließen nicht selber zu kümmern!
wie BlackJack schon sagte, ist diese Funktion "add_line()" überflüssig:
Code: Alles auswählen
def add_line(line): lines.append(line)
ftp.retrlines('LIST', add_line)
Du kannst das eben auch so lösen:
Ansonsten steht sämtlicher Code auf Modulebene; meist ist es besser, den Code in Funktionen auszulagern.
Der obere Teil ist auch schwer zu lesen. Ich würde prints und sämtlichen anderen Code nicht zwischen die imports packen, sondern erst danach (also auch die Benutzernamenzuweisung usw).
Re: Tokenize list
Verfasst: Donnerstag 9. Dezember 2010, 17:06
von rockabilly1985
so.... soweit funzt die Sache jetzt. ABER..... am Ende ( im Code als #Kommentar )
Code: Alles auswählen
#!/usr/bin/python
import re
import sys
import datetime
import pickle
import os
#from datetime import date, datetime
today = datetime.datetime.today()
oneday = datetime.timedelta(days=-1)
yesterday = today + oneday
#FTP Login
user = os.getenv("BM_UPLOAD_FTP_USER")
passwd = os.getenv("BM_UPLOAD_FTP_PASSWORD")
host = os.getenv("BM_UPLOAD_FTP_HOSTS")
#FTP login
from ftplib import FTP
ftp = FTP(host)
ftp.login (user, passwd)
#########
lines = []
def add_line(line): lines.append(line)
ftp.retrlines('LIST', add_line)
ftp.quit()
#### SPLIT LINES
dates= []
for line in lines:
m = re.search('\.(\d+)\.tar.gz', line)
if not m is None:
dates.append(m.group(1))
yesterday_str = "%s-%s-%s" % (yesterday.year,yesterday.month,yesterday.day)
today_str = "%s-%s-%s" % (today.year,today.month,today.day)
#print yesterday_str
#print today_str
for date in dates:
d = datetime.datetime.strptime(date, "%Y%m%d")
date_file = "%s-%s-%s" % (d.year,d.month,d.day)
if yesterday.year == d.year and yesterday.month == d.month and yesterday.day == d.day:
print "FILE VON GESTERN GEFUNDEN: ", date
exit (0)
###Hier wollte ich eigentlich elif benutzen .... will er aber iwie nicht. Da ja aber, wenn die if Bedingung nicht erfüllt ist eh weiter macht müsste es ja funzen oder?
if today.year == d.year and yesterday.month == d.month and yersterday.day == d.day
print "FILE VON HEUTE GEFUNDEN: ", date
exit (0)
###Genau der gleiche Scheiß mit else
print "KEIN BACKUP DER LETZTEN ZWEI TAGE: ", date
exit (1)
Der Code läuft auf jedenfall durch.
Nur die letzten prints macht der Meister nicht
Danke!
Re: Tokenize list
Verfasst: Donnerstag 9. Dezember 2010, 17:25
von rockabilly1985
habs
Code: Alles auswählen
#!/usr/bin/python
import re
import datetime
import os
today = datetime.datetime.today()
oneday = datetime.timedelta(days=-1)
yesterday = today + oneday
#FTP Login
user = os.getenv("BM_UPLOAD_FTP_USER")
passwd = os.getenv("BM_UPLOAD_FTP_PASSWORD")
host = os.getenv("BM_UPLOAD_FTP_HOSTS")
#FTP login
from ftplib import FTP
ftp = FTP(host)
ftp.login (user, passwd)
#########
lines = []
def add_line(line): lines.append(line)
ftp.retrlines('LIST', add_line)
ftp.quit()
#### SPLIT LINES
dates = []
for line in lines:
m = re.search('\.(\d+)\.tar.gz', line)
if not m is None:
dates.append(m.group(1))
for date in dates:
d = datetime.datetime.strptime(date, "%Y%m%d")
if yesterday.year == d.year and yesterday.month == d.month and yesterday.day == d.day:
print "FILE VON GESTERN GEFUNDEN: ", date
exit (0)
if today.year == d.year and today.month == d.month and today.day == d.day:
print "FILE VON HEUTE GEFUNDEN: ", date
exit (0)
print "KEIN BACKUP DER LETZTEN ZWEI TAGE: ", date
exit (1)
Vielen Dank für eure Hilfe ^^
Re: Tokenize list
Verfasst: Donnerstag 9. Dezember 2010, 17:34
von Hyperion
Das dürfte an den Einrückungen liegen - leider zeigst Du dein elif-Konstrukt ja nicht. Das exit() sollte ja wohl in den if-Block rein.
Generell: Wäre schön gewesen, wenn Du auch auf die Antworten von BlackJack und mir eingegangen wärst.
Re: Tokenize list
Verfasst: Donnerstag 9. Dezember 2010, 17:39
von rockabilly1985
ja bin ich teilweise ..... .append z.Bleistift .... hat mir super weitergeholfen.
Manch anderes hab ich auch probiert.... hat aber iwie nicht gefunzt....
Mit Hilfe von euch, google, python doku hab ich mir schließlich was zusammen reimen können ^^