CSV 文件正确放置并且 CSV 文件中存在密钥时引发 KeyError

ero*_*msr 0 python csv

我有这个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 也能正常工作)。

Cas*_*Cow 5

这是一个糟糕的问题,因为没有人知道 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。