You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中解析非标准CSV文件?求适配的解析库

解析非标准CSV:未包裹字段内的双引号对转义问题

我遇到一个CSV解析问题:手头有一份无法修改的CSV文件,部分未被引号包裹的字段包含text ""text""这类内容,期望解析后得到text "text"。Java的OpenCSV能正常处理这种格式,但Python的内置csv库、pandas和clevercsv都不行——这些库只在字段被整体引号包裹时,才会把""解析为转义的"。

测试用例

测试文件 test.csv

col1,col2
idk,text ""text""
idk,"text ""text"""
idk,"text, text"
idk,text """"text""""
idk,"text """"text""""""

预期解析结果

[
    {'col1': 'idk', 'col2': 'text "text"'},
    {'col1': 'idk', 'col2': 'text "text"'},
    {'col1': 'idk', 'col2': 'text, text'},
    {'col1': 'idk', 'col2': 'text ""text""'},
    {'col1': 'idk', 'col2': 'text ""text""'},
]

测试代码

import csv
import unittest
from typing import Dict, List


def parse_input(path: str) -> List[Dict[str, str]]:
    with open(path, 'r') as f:
        reader = csv.DictReader(f)
        return list(reader)


class TestStringMethods(unittest.TestCase):
    def test_parsing(self) -> None:
        parsed = parse_input('./test.csv')
        self.assertEqual(
            parsed,
            [
                {
                    'col1': 'idk',
                    'col2': 'text "text"',
                },
                {
                    'col1': 'idk',
                    'col2': 'text "text"',
                },
                {
                    'col1': 'idk',
                    'col2': 'text, text',
                },
                {
                    'col1': 'idk',
                    'col2': 'text ""text""',
                },
                {
                    'col1': 'idk',
                    'col2': 'text ""text""',
                },
            ],
        )


if __name__ == '__main__':
    unittest.main()

解决方案:使用 pyopencsv 库

pyopencsv 是OpenCSV的Python实现,完全兼容OpenCSV的解析规则,能正确处理这种非标准CSV格式。

安装

pip install pyopencsv

修改后的解析函数

from pyopencsv import CsvReader
from typing import Dict, List


def parse_input(path: str) -> List[Dict[str, str]]:
    rows = []
    with open(path, 'r') as f:
        reader = CsvReader(f, has_header=True)
        headers = reader.get_headers()
        for row in reader:
            rows.append(dict(zip(headers, row)))
    return rows

替换原测试代码中的parse_input函数后,测试即可通过。

如果不想引入第三方库,也可以预处理CSV内容,将未被引号包裹的字段中的""替换为",但这种方式需要区分字段是否被包裹,逻辑复杂容易出错,因此更推荐直接使用兼容OpenCSV规则的库。

内容的提问来源于stack exchange,提问作者Bangerino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:38:11