2016-10-27 6 views
1

Ich versuche, eine Datei zu analysieren, die eine Reihe von Einträgen enthält, die unter anderem ein Datum in der letzten Spalte enthält.Python: Datum/Uhrzeit Format

Walmart,Retail,482,-0.7,2200000,Arkansas,31-10-1969 

Ich habe versucht, dies zu tun:

from datetime import datetime 

def readdata (fname): 

    print ('*'*5,'Reading Records From File',fname,'*'*5) 

    data = [] 

    readf = open(fname,'r') 
    for line in readf:  
     name1, name2, No_1, No_2, No_3, name3, date1 = line.split(',') 
     date = datetime.strptime(date1,'%d-%m-%Y') 
     Number1 = float(No_1) 
     Number2 = float(No_2) 
     Number3 = int(No_3) 

     rec = [name1,name2,Number1,Number2,Number3,name3,date] 
     data.append(rec) 
    readf.close() 
    print('\nDone.\n\n') 
    return data 

Aber wenn ich versuche, das letzte Feld der Zeile (das Datum) zu einer tatsächlichen datetime.datetime Instanz zu konvertieren, bekomme ich folgende Fehlermeldung:

data_string[found.end():]) 
    ValueError: unconverted data remains: 

der volle Fehlerstack ist

Traceback (most recent call last): 
    File "C:\Users\Keitha Pokiha\Desktop\New folder\Program 2.py", line 42, in <module> 
    main() 
    File "C:\Users\Keitha Pokiha\Desktop\New folder\Program 2.py", line 39, in main 
    data = readdata('fname.txt') 
    File "C:\Users\Keitha Pokiha\Desktop\New folder\Program 2.py", line 12, in readdata 
    date = datetime.strptime(date1,'%d-%m-%Y') 
    File "C:\Users\Keitha Pokiha\AppData\Local\Programs\Python\Python35-32\lib\_strptime.py", line 510, in _strptime_datetime 
    tt, fraction = _strptime(data_string, format) 
    File "C:\Users\Keitha Pokiha\AppData\Local\Programs\Python\Python35-32\lib\_strptime.py", line 346, in _strptime 
    data_string[found.end():]) 
ValueError: unconverted data remains: 
+0

ich weiß datestr sollte Datum sein –

+1

Es würde wirklich helfen, wenn Sie sicherstellten, dass der gesamte Code in Ihrer Frage richtig formatiert ist. Außerdem kann ich in Ihrem Snippet keinen Hinweis auf 'found' oder' data_string' finden, daher ist es schwierig zu sagen, warum der Fehler auftritt. Und Sie scheinen eine Datei mit mehr Informationen als nur ein Datum zu lesen (sieht für mich wie eine Komma-getrennte Wertdatei aus). Könnten Sie ein paar Zeilen hinzufügen, wie die Datei aussieht? – BorrajaX

+0

Walmart, Retail, 482, -0.7,2200000, Arkansas, 31-10-1969 –

Antwort

2

Das Problem, das Sie zu haben scheinen, ist, dass, wenn Sie for line in readf: tun, line mit dem Wagenrücklauf endet (Sonderzeichen \n, die eine neue Linie signalisiert) so statt zu konvertieren 31-10-1969-datetime, Python versucht, zu versuchen, 31-10-1969\n zu konvertieren , mit dem Format %d-%m-%Y Daher, wenn es das Jahr analysiert (%Y) findet es eine unerwartete \n und deshalb sehen Sie diesen Fehler: weil es nicht weiß, was damit zu tun ist.

Sie haben mehrere Möglichkeiten, dies zu beheben. Im Folgenden finden Sie zwei, dass „reparieren“ die Leselinie finden, und eine dritte, dass „fixes“ das erwartete Format von datetime:

  1. Sie können entfernen, dass \n es rstrip, nachdem Sie die Zeile gelesen haben:

    name1, name2, No_1, No_2, No_3, name3, date1 = line.rstrip().split(',') 
    date = datetime.strptime(date1, '%d-%m-%Y') 
    
  2. Oder Sie könnten das Verfahren here erklärt verwenden und das letzte Zeichen in der Zeile entfernen, wie folgt aus:

    name1, name2, No_1, No_2, No_3, name3, date1 = line[:-1].split(',') 
    
  3. Oder Sie könnten das datetime Modul erzählen eine neue Zeile als auch in der Zeichenfolge zu erwarten:

    name1, name2, No_1, No_2, No_3, name3, date1 = line.split(',') 
    date = datetime.strptime(date1, '%d-%m-%Y\n') 
    

Ich würde 1. verwenden, denn wenn Ihr line, nicht mit einem Newline-Zeichen am Ende wird alles funktioniert noch immer.

PS (als Randnotiz): Wenn Sie eine durch Kommata getrennte Wert Datei zu lesen, würde ich dringend empfehlen Ihnen die Verwendung des csv.reader Modul machen.

+0

Ja, es hat sehr gut funktioniert, danke, damit ich eine meiner Beurteilungen beenden kann. –

+0

Viel Glück! Und da Sie kein Mitglied von S.O. zu lange, hier geht es: Denken Sie daran, wenn eine der Antworten Ihre Frage gelöst hat, ist es gut, dass Sie es als akzeptiert markieren (großes Kontrollkästchen links neben der Antwort). Es gibt Ihnen Reputationspunkte, es gibt der Person, die Zeit verbracht hat, Punkte zu beantworten, und am wichtigsten, es wird zukünftigen Lesern helfen zu sehen, dass die Antwort hilfreich war. Siehe http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 (nicht nur für diesen Beitrag, sondern auch für zukünftige Fragen) Cheers **: -) ** – BorrajaX

+1

Wird tun, Prost –