【问题标题】:Pandas error reading csv with double quotesPandas 读取带有双引号的 csv 时出错
【发布时间】:2021-09-30 01:18:13
【问题描述】:

我已阅读所有相关主题 - 例如 this、this 和 this - 但无法找到有效的解决方案。

我有一个这样的输入 csv 文件:

ItemId,Content                                                      
i0000008,{"Title":"Edison Kinetoscopic Record of a Sneeze","Year":"1894","Rated":"N/A"}
i0000010,{"Title":"Employees, Leaving the Lumiére, Factory","Year":"1895","Rated":"N/A"}

我尝试了几种不同的方法,但都无法正常工作。我想将这个 csv 文件读入这样的 Dataframe:

ItemId    Content
--------  -------------------------------------------------------------------------------
i0000008  {"Title":"Edison Kinetoscopic Record of a Sneeze","Year":"1894","Rated":"N/A"}
i0000010  {"Title":"Employees, Leaving the Lumiére, Factory","Year":"1895","Rated":"N/A"}

使用以下代码(Python 3.9):

df = pd.read_csv('test.csv', sep=',', skipinitialspace = True, quotechar = '"')

据我了解,字典列内的逗号和引号内的逗号被视为常规分隔符,因此会引发以下错误:

pandas.errors.ParserError: Error tokenizing data. C error: Expected 4 fields in line 3, saw 6

是否有可能产生想要的结果?谢谢。

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    问题在于Content 列中的逗号被解释为分隔符。您可以使用pd.read_fwf 手动设置要拆分的字符数来解决此问题:

    df = pd.read_fwf('test.csv', colspecs=[(0, 8),(9,100)], header=0, names=['ItemId', 'Content'])  
    

    结果:

    ItemId Content
    0 i0000008 {"Title":"Edison Kinetoscopic Record of a Sneeze","Year":"1894","Rated":"N/A"}
    1 i0000010 {"Title":"Employees, Leaving the Lumiére, Factory","Year":"1895","Rated":"N/A"}

    【讨论】:

    • 这并不能解决问题,并且只给出字典中每一行的第一个键、值
    • @ThePyGuy 是正确的。它没有产生预期的结果,只有第一个键、值被读入内容列。
    • @thatOldITGuy 你说得对。我已经用一个更简单的解决方案更新了答案。
    • 上面的好解决方案。在此之后,OP 的下一步是遵循 steps to expand the JSON 并且 df 很好。
    • @RJAdriaansen 这是一个很好的解决方案,但真正的 CSV 有一个更大(和可变长度)的 JSON 列,所以我猜 (9,100) 列规范必须被猜到,对吧?
    【解决方案2】:

    我认为你不能用 pandas 正常读取它,因为它的分隔符多次用于单个值;但是,使用 python 读取并进行一些处理,您应该能够将其转换为 pandas 数据帧:

    def splitValues(x):
        index = x.find(',')
        return x[:index], x[index+1:].strip()
    
    import pandas as pd
    data = open('file.csv')
    columns = next(data)
    columns = columns.strip().split(',')
    df = pd.DataFrame(columns=columns, data=(splitValues(row) for row in data))
    
    

    输出:

         ItemId                                                                          Content
    0  i0000008   {"Title":"Edison Kinetoscopic Record of a Sneeze","Year":"1894","Rated":"N/A"}
    1  i0000010  {"Title":"Employees, Leaving the Lumiére, Factory","Year":"1895","Rated":"N/A"}
    

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2019-10-31
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多