Python: Date/time 格式
Python: Date/time format
我正在尝试解析一个包含一堆条目的文件,这些条目在其他字段中的最后一列中包含 日期。
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:
您似乎遇到的问题是,当您执行 for line in readf:
时,line
以回车符 return 结尾(特殊字符 \n
,表示新行)所以 31-10-1969
不是尝试将 31-10-1969
转换为 datetime
,而是尝试使用 %d-%m-%Y
格式转换 31-10-1969\n
因此,当它完成解析时年份 (%Y
) 它发现了一个意外的 \n
这就是为什么你会看到这个错误:因为它不知道如何处理它。
您有多种选择来解决此问题。下面你会发现两个 "fix" 读取行,第三个 "fixes" datetime
:
期望的格式
您可以在阅读以下行后使用 rstrip
删除 \n
它:
name1, name2, No_1, No_2, No_3, name3, date1 = line.rstrip().split(',')
date = datetime.strptime(date1, '%d-%m-%Y')
或者您可以使用解释的方法 here 并删除行中的最后一个字符,如下所示:
name1, name2, No_1, No_2, No_3, name3, date1 = line[:-1].split(',')
或者您可以告诉 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
模块。
我正在尝试解析一个包含一堆条目的文件,这些条目在其他字段中的最后一列中包含 日期。
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:
您似乎遇到的问题是,当您执行 for line in readf:
时,line
以回车符 return 结尾(特殊字符 \n
,表示新行)所以 31-10-1969
不是尝试将 31-10-1969
转换为 datetime
,而是尝试使用 %d-%m-%Y
格式转换 31-10-1969\n
因此,当它完成解析时年份 (%Y
) 它发现了一个意外的 \n
这就是为什么你会看到这个错误:因为它不知道如何处理它。
您有多种选择来解决此问题。下面你会发现两个 "fix" 读取行,第三个 "fixes" datetime
:
您可以在阅读以下行后使用
rstrip
删除\n
它:name1, name2, No_1, No_2, No_3, name3, date1 = line.rstrip().split(',') date = datetime.strptime(date1, '%d-%m-%Y')
或者您可以使用解释的方法 here 并删除行中的最后一个字符,如下所示:
name1, name2, No_1, No_2, No_3, name3, date1 = line[:-1].split(',')
或者您可以告诉
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
模块。