Pandas 字段分隔符和双引号

pandas field separator and double quotes

提问人:EBAH 提问时间:11/24/2022 更新时间:11/24/2022 访问量:108

问:

我需要在 pandas 中加载一个不是 100% CSV“兼容”的 CSV 文件,下面是一个示例:

"Transaction date";"Accounting date";"Counterparty's data";"Title"
2021-08-22;2021-08-22;" "SPOLEM" ASS "ALDONA" AUGUSTOW ";" Title 450"
2019-09-02;2019-09-02;" 13XYZ05 "SKOWRONEK" NIEGOWA ";" Title 1300"
2010-07-18;2010-07-18;" APTEKA "SLOWINSKA" SPOLKALEBA ";" Title 123"

我使用以下命令将此 csv 文件 (csv_in) 读入 pandas 数据帧中:

df = pd.read_csv(csv_in, \
                 delimiter=';', \
                 engine='python', \
                 quoting=1)

我知道错误的csv格式是罪魁祸首,但是:

  • 我怎样才能指示 pandas 指示进程在哪一行中断,而不是简单地通知我 pandas.errors.ParserError: ';' 预期在 '“' 之后......我想知道它在csv_in文件的哪一行中断了......拥有 6500 行的文件,您可以想象我在没有任何帮助的情况下找到这些畸形行是多么困难,除了“嘿,有一个错误!
  • 是否可以指示熊猫使用组合 [;“]作为起始文本字段和 [“;]作为结束文本字段?这应该可以解决问题,并且显然可以以某种方式被 CSV 模块(import csv)理解,该模块读取文件而不会引发错误,而不会跳过行

谢谢! 埃文

python-3.x pandas Dataframe CSV 报价

评论


答:

1赞 Naveed 11/24/2022 #1

指定 quotechar 并删除引擎属性(导致 C 为默认值)


pd.read_csv("csv2.txt", \
                 delimiter=';', \
                 quotechar='"')
    Transaction date    Accounting date     Counterparty's data     Title
0   2021-08-22  2021-08-22  SPOLEM" ASS "ALDONA" AUGUSTOW "     Title 450
1   2019-09-02  2019-09-02  13XYZ05 SKOWRONEK" NIEGOWA "    Title 1300
2   2010-07-18  2010-07-18  APTEKA SLOWINSKA" SPOLKALEBA "  Title 123

评论

0赞 EBAH 11/24/2022
惊讶!12分钟回复... :)谢谢!另一方面,引擎似乎不允许我跳过页脚行。有什么想法吗?
1赞 Andrej Kesely 11/24/2022 #2

您可以尝试通过以下方式转义内部引号来清理数据:"\

import re
import pandas as pd
from io import StringIO


with open("your_data.csv", "r") as f_in:
    data = f_in.read()

data = re.sub(
    r'"([^;]+)"',
    lambda g: '"' + g.group(1).replace('"', r"\"").strip() + '"',
    data,
)

df = pd.read_csv(StringIO(data), delimiter=";", quotechar='"', escapechar="\\")
print(df)

这打印:

  Transaction date Accounting date             Counterparty's data       Title
0       2021-08-22      2021-08-22  "SPOLEM" ASS "ALDONA" AUGUSTOW   Title 450
1       2019-09-02      2019-09-02     13XYZ05 "SKOWRONEK" NIEGOWA  Title 1300
2       2010-07-18      2010-07-18   APTEKA "SLOWINSKA" SPOLKALEBA   Title 123