我使用下面的代码来获取数据列表,但是列没有被解析,它会抛出一个错误KeyError: 'Names'
import csv
# Open test.csv file in read mode
with open('test.csv', 'r') as csv_file:
reader = csv.DictReader(csv_file)
data = [row['Names'] for row in reader]
print(data)
例如,test.csv文件包含以下数据:
Names
John
Mary
Smith
paul
结果数据列表应该是:
['John', 'Mary', 'Smith', 'paul']
注意,我只有一个列,如示例中所示,这段代码在我的VM中运行良好,但是如果我在Gitlab中作为管道运行它就不起作用了。另外,如果我打开这个csv文件
, Gitlab会在存储库中抛出一个错误(如下所示)Failed to render the CSV file for the following reasons:
Unable to auto-detect delimiter; defaulted to ","
您解释过test.csv以
开头Name John
,但我认为你的意思是Names
,来匹配你的代码。
Gitlab抛出错误
那对我来说更像是一个警告。看来你还拿着你的data
名单,只是有一些额外的sys.stderr
噪声。
考虑使用import warnings
如果你想压制这种噪音。
您正在使用不同的CSV阅读器,或者不同版本的读者,在不同的环境中。尽量使用相同的版本,所以你会得到相同的行为。还要验证test.csv在每个文件中是否相同,可以使用/usr/bin/shasum。
您当前的CSV阅读器显然想要自动检测列分隔符。所以给它一些检测的机会。在每行后面添加一个无害的,
逗号,这样列数就增加了1。最后一列始终为空值。
$ sed -i '' 's/$/,/' test.csv
(在Linux上,与Mac不同,在进行就地编辑时不需要初始的空白文件扩展名,因此sed -i 's/$/,/' test.csv
就足够了。)
一些人报告了文件损坏会产生"无法自动检测分隔符";警告。
用cat -n *.csv
修饰你的文件或者更详细的cat -tevn *.csv
来验证每行包含正确的字段数。
或者让程序来做:
with open('test.csv') as csv_file:
reader = csv.DictReader(csv_file)
n = len(next(reader))
print(f"Each row should have {n} fields.")
for row in reader:
assert n == len(fields), fields
特别要小心多余的空行
的
reader = csv.DictReader(csv_file)
考虑显式使用
reader = csv.DictReader(csv_file, delimiter="n")
因此不需要自动检测。
使用cPython 3.10.8我无法使用以下命令重现该症状:
import csv
from io import StringIO
file = StringIO("NamesnnnAlicenBob" + "n" * 6)
reader = csv.DictReader(file)
for row in reader:
print(len(row), row)