使用双“双引号”和嵌入逗号读取 Pandas 中的 CSV 文件

Vin*_*nay 8 python csv pandas

我需要读取 Pandas 中的 CSV 文件,其中包含以下格式的数据(其中一个字段使用双“双引号”)

"column1","column2","column3","column4"
"10",""AB"","ABCD","abcd"
"11",""CD,E"","CDEF","abcd"
"12",""WER"","DEF,31","abcd"
Run Code Online (Sandbox Code Playgroud)

我期望正确解析的数据框是这样的

column1  column2  column3   column4
10       AB       ABCD      abcd
11       "CD,E"   CDEF      abcd
12       WER      "DEF,31"  abcd
Run Code Online (Sandbox Code Playgroud)

我尝试使用

df= pd.read_csv('sample.txt',quotechar='""', quoting=csv.QUOTE_ALL)
Run Code Online (Sandbox Code Playgroud)

df= pd.read_csv('sample.txt',quotechar='"', quoting=csv.QUOTE_ALL)
Run Code Online (Sandbox Code Playgroud)

但得到

TypeError: "quotechar" must be a 1-character string
Run Code Online (Sandbox Code Playgroud)

pandas.errors.ParserError: Error tokenizing data. C error: Expected 4 fields in line 3, saw 5
Run Code Online (Sandbox Code Playgroud)

有没有办法让我按原样读取此文件,而无需预处理和删除数据中的双“双引号”?

column2没有逗号时,我可以使用一些额外的引号读取数据,我可以在进一步的处理步骤中替换这些引号。column2仅当有逗号时我才会遇到解析问题。

kay*_*yoz 2

我不确定 pandas 是否可以自己做到这一点,因为您的数据中也有未转义的分隔符和引号。

但是,您应该能够在使用正则表达式通过转义字段中的引号来修改数据后解析它。

import re
from io import StringIO

data = """
"column1","column2","column3","column4"
"10",""AB"","ABCD","abcd"
"11",""CD,E"","CDEF","abcd"
"12",""WER"","DEF,31","abcd"
"""

data = re.sub('(?<!^)"(?!,")(?<!,")(?!$)', '\\"', data, flags=re.M)

pd.read_csv(StringIO(data), escapechar='\\')
Run Code Online (Sandbox Code Playgroud)

如果您正在读取文件,则:

with open('path/to/csv', 'r') as f:
    data = re.sub('(?<!^)"(?!,")(?<!,")(?!$)', '\\"', f.read(), flags=re.M)
    df = pd.read_csv(StringIO(data), escapechar='\\')
Run Code Online (Sandbox Code Playgroud)

正则表达式查找不在每行开头(?<!^)或结尾(?!$)的引号,以及不属于每个字段开头(?<!,")和结尾的引号(?!,")