无法使用python从CSV文件解析列名

  • 本文关键字:文件 CSV python python csv gitlab
  • 更新时间 :
  • 英文 :


我使用下面的代码来获取数据列表,但是列没有被解析,它会抛出一个错误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)

相关内容

  • 没有找到相关文章

最新更新