【问题标题】:python csv reader not reading all rowspython csv阅读器没有读取所有行
【发布时间】:2016-12-15 16:46:50
【问题描述】:

所以我在 CSV 文件中有大约 5008 行,总共 5009 行带有标题。我在同一个脚本中创建和编写这个文件。但是当我最后阅读它时,使用 pandas pd.read_csv 或 python3 的 csv 模块并打印 len,它输出 4967。我检查了文件中是否存在任何可能使 python 混淆但没有看到的奇怪字符。所有数据均以逗号分隔。

我也在 sublime 中打开它,它显示 5009 行而不是 4967。

我可以尝试来自 pandas 的其他方法,例如 merge 或 concat,但如果 python 不能正确读取 csv,那就没用了。

这是我尝试过的一种方法。

df1=pd.read_csv('out.csv',quoting=csv.QUOTE_NONE, error_bad_lines=False)
df2=pd.read_excel(xlsfile)

print (len(df1))#4967
print (len(df2))#5008

df2['Location']=df1['Location']
df2['Sublocation']=df1['Sublocation']
df2['Zone']=df1['Zone']
df2['Subnet Type']=df1['Subnet Type']
df2['Description']=df1['Description']

newfile = input("Enter a name for the combined csv file: ")
print('Saving to new csv file...')
df2.to_csv(newfile, index=False)
print('Done.')

target.close()

我尝试的另一种方法是

dfcsv = pd.read_csv('out.csv')

wb = xlrd.open_workbook(xlsfile)
ws = wb.sheet_by_index(0)
xlsdata = []
for rx in range(ws.nrows):
    xlsdata.append(ws.row_values(rx))

print (len(dfcsv))#4967
print (len(xlsdata))#5009

df1 = pd.DataFrame(data=dfcsv)
df2 = pd.DataFrame(data=xlsdata)

df3 = pd.concat([df2,df1], axis=1)

newfile = input("Enter a name for the combined csv file: ")
print('Saving to new csv file...')
df3.to_csv(newfile, index=False)    
print('Done.')

target.close()

但无论我以何种方式尝试 CSV 文件都是实际问题,python 写入正确但读取不正确。

编辑:最奇怪的部分是我在运行代码时完全没有编码错误或任何错误......

Edit2:在第一个代码示例中尝试使用 nrows 参数对其进行测试,最多可工作 4000 行。当我指定 5000 行时,它只读取 4967。

Edit3:用我的数据手动保存 csv 文件,而不是使用程序编写的文件,它读取了 5008 行。为什么python没有正确写入csv文件?

【问题讨论】:

  • 您确定每一行都以正确的换行符结尾吗?你试过error_bad_lines=True吗?
  • 您确定源文件不包含任何编码错误吗?你可以用open()打开它而没有任何错误吗?
  • 你确定然后在字段中间没有(保护/屏蔽)换行符?
  • @Tommy 是的,我在脚本中编写 CSV 的方式每行数据都以换行符结尾。
  • @DaVinci 当error_bad_lines=True 时会发生什么?

标签: python python-3.x csv pandas


【解决方案1】:

如果没有看到文件,我最好的猜测是,有些行的逗号过多或不足,可能是由于foo,bar 之类的值。

请尝试设置error_bad_lines=True。从 Pandas 文档:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html 看它是否捕获了错误的行,我的猜测是会有 41 行这样的行。

error_bad_lines : 布尔值,默认为 True 默认情况下,字段过多的行(例如,逗号过多的 csv 行)会引发异常,并且不会返回任何 DataFrame。如果为 False,那么这些“坏行”将从返回的 DataFrame 中删除。 (仅对 C 解析器有效)

csv.QUOTE_NONE 选项在写入时似乎不引用字段并将当前分隔符替换为 escape_char + delimiter,但您没有粘贴您的编写代码,但在阅读时不清楚该选项的作用。 https://docs.python.org/3/library/csv.html#csv.Dialect

【讨论】:

  • 我确实尝试将其设置为 True,但是 csv 的 len 仍然输出为 4967。
  • @DaVinci 你的分隔符中有任何值吗?
  • 我检查过了,没有,没有包含逗号的数据值。
【解决方案2】:

我也遇到了这个问题。我意识到我的一些台词有开放式引号,这出于某种原因干扰了读者。

例如,有些行写成:

GO:0000026  molecular_function  "alpha-1
GO:0000027  biological_process  ribosomal large subunit assembly
GO:0000033  molecular_function  "alpha-1

这导致行被错误地读取。 (不幸的是,我对 csvreader 的工作原理知之甚少,无法告诉您原因。希望有人能澄清引用行为!)

我刚刚删除了引号,它成功了。

已编辑:如果您想保留引号,此选项也有效:

quotechar=None

【讨论】:

    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多