我有这个Python代码:
import csv
csvfile = 'stations-nl-2014-01.csv'
try:
f = open(csvfile, 'r')
reader = csv.DictReader(f, delimiter=';')
for row in reader:
print(row['name'], '--', row['type'])
finally:
f.close()
Run Code Online (Sandbox Code Playgroud)
我可以使用常规 csv.reader() 方法,但有人告诉我使用 csv.DictReader() 是最佳实践,因为您可以按列名称选择列,这使代码更具可读性。但是,当我使用正常的 csv.reader() 方法时,没有显示错误。当我使用 DictReader 时,出现以下错误:
print(row['name'], '--', row['type'])
KeyError: 'name'
当我将代码更改为:
import csv
csvfile = 'stations-nl-2014-01.csv'
try:
f = open(csvfile, 'r')
reader = csv.reader(f, delimiter=';')
for row in reader:
print(row)
finally:
f.close()
Run Code Online (Sandbox Code Playgroud)
...一切正常。但是使用 csv.DictReader() 并按列名称选择行会引发错误。有人知道怎么修这个东西吗?我已经仔细检查了 .csv 文件的路径和列名称,一切都是正确的(没有 DictReader 也能正常工作)。
这是一个糟糕的问题,因为没有人知道 CSV 文件中的内容。
然而我也遇到了同样的情况,在第一个键上我遇到了键错误。事实证明,该文件最初是在 Excel 中创建的,以 UTF-8 编码保存,并且有一个静默'\ufeff'前缀
我的解决方法是将每个字典转换为使用 ascii 编码的字符串
def convert_row( row ):
row_dict = {}
for key, value in row.items():
keyAscii = key.encode('ascii', 'ignore' ).decode()
valueAscii = value.encode('ascii','ignore').decode()
row_dict[ keyAscii ] = valueAscii
return row_dict
Run Code Online (Sandbox Code Playgroud)
这也可以通过 map / lambda 来完成,例如
def ascii_encode( str ):
return str.encode( 'ascii', 'ignore' ).decode()
def convert_row( row ):
return dict(map( lambda(key,value) :
(ascii_encode(key),ascii_encode(value) ), row.items() ) )
Run Code Online (Sandbox Code Playgroud)
或类似的东西
我的回答中的主要问题是,如果文件是 utf-8,则可能需要对字符串进行 ascii_encode。
| 归档时间: |
|
| 查看次数: |
19220 次 |
| 最近记录: |