我需要读取 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仅当有逗号时我才会遇到解析问题。
我不确定 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)
正则表达式查找不在每行开头(?<!^)或结尾(?!$)的引号,以及不属于每个字段开头(?<!,")和结尾的引号(?!,")
| 归档时间: |
|
| 查看次数: |
13199 次 |
| 最近记录: |