Tokenize list

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rockabilly1985
User
Beiträge: 9
Registriert: Montag 6. Dezember 2010, 14:11

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:

Code: Alles auswählen

...
Dec  3
Dec  4
usw.
...
oder

Code: Alles auswählen

...
20101203
20101204
wie das evtl noch umwandeln in

Code: Alles auswählen

2010-12-04
2010-12-04
??
damit ich das mit datetime verdingsen kann :-D

Vielen Dank!
Mit dem tokenizen komm ich als blutiger Anfänger einfach nicht weiter.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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))
rockabilly1985
User
Beiträge: 9
Registriert: Montag 6. Dezember 2010, 14:11

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 :-D....
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 ^^
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.
rockabilly1985
User
Beiträge: 9
Registriert: Montag 6. Dezember 2010, 14:11

Ja das ist mit pickle gemacht....mh wäre deiner Meinung nach was anderes besser geeignet. Hab mich da so durchgegooglet :-D

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!
Zuletzt geändert von Anonymous am Donnerstag 9. Dezember 2010, 09:46, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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:

Code: Alles auswählen

ftp.retrlines('LIST', lines.append)
rockabilly1985
User
Beiträge: 9
Registriert: Montag 6. Dezember 2010, 14:11

So erste Hürde geschafft :-D

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Es gibt hier spezielle Python-Code-tags. Wenn Du die für Quellcode benutzt wird er hübsch mit Syntax Highlighting versehen ;-)

Zum Code:

Code: Alles auswählen

if not m is None:
    # do something
Ist mindestens umständlich:

Code: Alles auswählen

if m:
    # do something
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:

Code: Alles auswählen

ftp.retrlines('LIST', lines.append)
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).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
rockabilly1985
User
Beiträge: 9
Registriert: Montag 6. Dezember 2010, 14:11

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 :evil:

Danke!
rockabilly1985
User
Beiträge: 9
Registriert: Montag 6. Dezember 2010, 14:11

habs :-D

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 ^^
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
rockabilly1985
User
Beiträge: 9
Registriert: Montag 6. Dezember 2010, 14:11

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 ^^
Antworten