如何在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
相关产品推荐
相关产品推荐

