【问题标题】:Pandas read_csv - How to handle a comma inside double quotes that are themselves inside double quotesPandas read_csv - 如何处理双引号内的逗号,这些逗号本身就在双引号内
【发布时间】:2019-05-11 13:11:22
【问题描述】:

这和double quoted elements in csv cant read with pandas不是同一个问题。

不同之处在于那个问题:“ABC,DEF”破坏了代码。

这里,“ABC "DE" ,F" 正在破坏代码。

整个字符串应该被解析为'ABC "DE", F'。相反,内部双引号会导致下面提到的问题。

我正在使用包含以下类型条目的 csv 文件:

标头1、标头2、标头3、标头4

2001-01-01,123456,"abc def",V4

2001-01-02,789012,"ghi "jklm" n,op",V4

第二行数据破码,报错如下:

ParserError: Error tokenizing data. C error: Expected 4 fields in line 1234, saw 5

我尝试过使用各种sepdelimiterquoting 等参数,但似乎没有任何效果。

有人可以帮忙吗?谢谢!

【问题讨论】:

  • 不是同一个问题。请参阅上述问题的更新。谢谢你,汤姆。
  • 使用 fp.read 将文件作为单个文本字符串读取。 ` 从 io 导入 StringIO; clean_text = text.replace(',"', '$$commadquote').replace('",', '$$dquotecomma').replace('"', "'").replace('$$commadquote' , ',"').replace( '$$dquotecomma', '",'); pd.read_csv(StringIO(clean_text))

标签: python pandas


【解决方案1】:

基于您在此处提供的两行是一个选项,其中将文本文件读入Series 对象,然后通过Series.str.extract() 使用正则表达式提取,在DataFrame 中获取您想要的信息:

with open('so.txt') as f:
    contents = f.readlines()

s = pd.Series(contents)

s 现在如下所示:

0 header1, header2, header3,header4\n 1 \n 2 2001-01-01,123456,"abc def",V4\n 3 \n 4 2001-01-02,789012,"ghi "jklm" n,op",V4

现在您可以使用正则表达式提取将您想要的内容放入DataFrame

df = s.str.extract('^([0-9]{4}-[0-9]{2}-[0-9]{2}),([0-9]+),(.+),(\w{2})$')

# remove empty rows
df = df.dropna(how='all')

df 如下所示:

0 1 2 3 2 2001-01-01 123456 "abc def" V4 4 2001-01-02 789012 "ghi "jklm" n,op" V4

你可以用df.columns = ['header1', 'header2', 'header3', 'header4']设置你的列名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多