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

Python CSV读写:含未加引号回车的内容解析错误及非QUOTE_ALL解决方案

CSV含\r字符的读写问题解决方案

核心原因

默认的csv.QUOTE_MINIMAL策略仅会给包含writer指定的lineterminator(你设置的是\n)、字段分隔符或引号的字段添加引号。你的字段里是\r,不在触发引号的范围内,因此写入时\r以裸字符形式存在;而csv.reader会将任何裸的\r、\n或\r\n视为行分隔符,导致错误拆分行。

不使用QUOTE_ALL的解决方法

可以用quoting=csv.QUOTE_NONNUMERIC参数替代,它会自动为非数值类型的字段添加引号,既能包裹含\r的字符串,又不会像QUOTE_ALL那样给所有字段(包括数值)加引号:

import csv

value = 'a string with \r in it'

# 写入时添加quoting=csv.QUOTE_NONNUMERIC
with open('test_file', 'wt', newline='', encoding='utf-8-sig') as f:
    csv_writer = csv.writer(f, lineterminator='\n', quoting=csv.QUOTE_NONNUMERIC)
    csv_writer.writerow([value])

with open('test_file', 'rt', newline='', encoding='utf-8-sig') as f:
    csv_reader = csv.reader(f, lineterminator='\n')
    value_from_csv_file = next(csv_reader)[0]

print(f'value: {repr(value)}')
print(f'value_from_csv_file: {repr(value_from_csv_file)}')
assert value_from_csv_file == value  # 断言通过

此时生成的文件中,\r会被引号包裹,读取时不会被误判为行分隔符。

能否配置reader按QUOTE_ALL规则处理?

不行。csv.reader的行为严格遵循CSV规范:只有当\r处于引号包裹的字段内时,才会被视为普通字符;如果是裸\r,无论怎么配置reader参数,都会被解析为行分隔符。问题的根源在写入阶段,必须通过writer的参数确保特殊字符被正确包裹,而非靠reader逆向修复。

为何Python生成的文件自身无法读取?

因为你最初的writer未设置合适的quoting参数,导致含\r的字段未被引号包裹。writer默认的QUOTE_MINIMAL不认为\r是需要引号的字符(仅识别你指定的\n作为行终止符),而reader会将所有裸换行符(包括\r)当成行分隔符,因此出现解析不一致的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:17:50