2016-10-27 10 views
1

Я пытаюсь проанализировать файл, содержащий содержащуюся в нем группу записей, которая среди других полей содержит дату в ее последнем столбце.Python: Формат даты/времени

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

Я попытался сделать это:

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 

Но когда я пытаюсь преобразовать последнее поле строки (дата) к фактическому datetime.datetime примеру, я получаю следующее сообщение об ошибке:

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

полный стек ошибка

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

Я знаю, что datestr должно быть датировано –

+1

Это действительно поможет, если вы убедитесь, что весь код в вашем вопросе правильно отформатирован. Кроме того, я не вижу в вашем фрагменте ссылки на 'found' или' data_string', поэтому сложно сказать, почему происходит ошибка. И вы, кажется, читаете файл с большей информацией, чем просто дата (выглядит как файл с разделителями-запятыми для меня). Не могли бы вы добавить пару строк, как выглядит файл? – BorrajaX

+0

Walmart, Розничная торговля, 482, -0,7,2200000, Арканзас, 31-10-1969 –

ответ

2

Проблема, которую вы, кажется, имея в том, что когда вы делаете for line in readf:, line заканчивается возвратом каретки (специальный символ \n, который сигнализирует о новой линии), так что вместо того, чтобы пытаться преобразовать 31-10-1969 в datetime, Python пытается преобразовать 31-10-1969\n , используя формат %d-%m-%Y Поэтому, когда он заканчивает синтаксический анализ года (%Y), он находит неожиданное \n, и именно поэтому вы видите эту ошибку: потому что он не знает, что с ним делать.

У вас есть несколько вариантов исправить это. Ниже вы найдете два, что «исправить» линию для чтения, и третий, который «исправляет» формат, ожидаемый datetime:

  1. Вы можете удалить, что \n его с помощью rstrip после прочтения строки:

    name1, name2, No_1, No_2, No_3, name3, date1 = line.rstrip().split(',') 
    date = datetime.strptime(date1, '%d-%m-%Y') 
    
  2. Или вы можете использовать метод, описанный here и удалить последний символ в строке, например:

    name1, name2, No_1, No_2, No_3, name3, date1 = line[:-1].split(',') 
    
  3. Или вы могли бы сказать datetime модуль ожидать новой строки, а в строке:

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

Я бы использовать 1., потому что, если ваш line не заканчивается символом новой строки, все будет все еще работают.

PS (в качестве дополнительной заметки): Если вы читаете файл с разделителями-запятыми, я настоятельно рекомендую вам использовать модуль csv.reader.

+0

Да, я очень хорошо поблагодарил вас, это позволит мне закончить одну из моих оценок. –

+0

Удачи! И, поскольку вы не были членом S.O. слишком долго, вот оно: Помните, что если какой-либо из ответов разрешил ваш вопрос, хорошо, что вы отмечаете его как принятое (большой флажок слева от ответа). Это даст вам очки репутации, это даст человеку, который потратил время на ответы, и, что самое важное, это поможет будущим читателям понять, что ответ был полезен. См. Http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 (не только для этого сообщения, но и для ваших будущих вопросов) Приветствия **:) ** – BorrajaX

+1

Будет, приветствует –