【问题标题】:Python read_csv tokenizing error / Reading from an inconsistent csv filePython read_csv 标记错误/从不一致的 csv 文件中读取
【发布时间】:2020-02-16 10:43:30
【问题描述】:

我有一个包含几百行和 13 列的 csv 文件。 csv文件的结构如下(示例):

a  b  c  d 

23 43 54 65

76 23 43 63

.

.

a  b  e  c  d

21 12 43 12 09 

23 12 32 43 87

一个标题的值出现在另一个标题下。结果,当我使用 read_csv 时,我得到 ParserError: Error tokenizing data。 C 错误:第 27458 行中预期有 12 个字段,但看到了 13 个。

关于如何清理/重新排列 csv 文件并将右列值放在右列下的任何建议?也许创建一个新的 csv 或将其输入到数据库中。谢谢

【问题讨论】:

  • 你确定 csv 是干净的吗?您是否检查了第 27458 行,是否真的比应有的多 1 列?
  • 听起来您实际上并没有“一个 csv 文件”本身,您有多个 csv 文件,它们已附加在一起并存储在一个磁盘文件中。您可能需要对原始文件进行一些预处理,将不同的 csv“块”拆分为单独的文件,单独导入它们,以免列混乱(如 here 所述),然后合并将它们组合成一个 DataFrame。

标签: python pandas csv sqlalchemy


【解决方案1】:

如果您不是特别需要创建数据框,那么您可以通过不使用 pandas 轻松处理此问题。标准 csv 模块将愉快地读取不同长度的行。每一行都作为一个列表返回。您可以直接使用它们,或者如果您需要清理 csv,您可以将空字符串附加到列表中,使它们的长度相同,然后将它们写回新文件。

import csv

with open('test.txt','r') as f:
    rdr=csv.reader(f)
    for i in rdr:
        print(i)

【讨论】:

    【解决方案2】:

    如果您可以在 csv 文件中提供列名(总共 13)作为文件的第一行,您将能够使用 read_csv 它将在没有给出值的地方返回一个 null 数据,然后您可以将 NaN 替换为您想要的任何其他值。

    【讨论】:

    • 好主意,除了问题表明文件以 n 列 [a, b, c, d] 开头,然后在文件的某个位置在中间插入一个附加列 [ a, b, e, c, d]。尝试单次使用read_csv 会失败,因为文件的第一部分会将“c”值读入列[2],但是一旦添加新列,它就会将“e”值读入列[2] ] 和 "c" 值到列 [3] 中。
    猜你喜欢
    • 2016-12-26
    • 2019-04-29
    • 1970-01-01
    • 2016-12-12
    • 2012-06-17
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多