Python读取分号分隔CSV时调用split得到异常拆分结果?
异常拆分的原因分析
1. csv.reader 默认配置与文件格式不匹配
csv.reader默认使用逗号 , 作为字段分隔符,但你的CSV文件实际用分号 ; 分隔字段,且字段内部的逗号(比如a 0,25作为小数的小数点逗号)是内容的一部分,不是分隔符。
未指定delimiter参数时,csv模块会先按错误的逗号规则拆分整行:
- 第三行
2222;a 0,25;1.00仅包含一个逗号,会被拆成两个元素:['2222;a 0', '25;1.00']
2. 冗余的二次拆分操作
csv.reader迭代返回的每一行本身就是拆分完成的列表,不需要额外手动split。你的代码中取row[0]再按分号拆分的逻辑,相当于在csv已经错误拆分的基础上再次处理:
- 第三行被csv拆出的第一个元素是
2222;a 0,再按分号拆分就得到了异常输出['2222', 'a 0']
3. 无效的类型判断
csv.reader迭代返回的每行永远是列表类型,isinstance(row, str)判断永远不会触发,属于完全冗余的代码。
正确实现方式
优先使用csv模块的内置能力处理,不需要手动拆分,匹配文件格式配置即可:
import csv for file in csvs: with open(file, encoding="utf8") as f: # 指定分号为分隔符,完全匹配你的CSV格式 reader = csv.reader(f, delimiter=";") for row in reader: # csv模块已经完成正确拆分,直接输出即可 print(row)
特殊场景补充
如果字段内部包含真实换行符(比如foo和bar之间是实际换行,不是字面的\n字符),需要将该字段用双引号包裹,符合标准CSV规范:
id;name;number 1111;"foo bar";2.00 2222;a 0,25;1.00
csv模块默认会识别双引号包裹的内容,不会把内部的换行、逗号当成分隔符。
注意:不要手动对CSV行执行split操作,标准CSV存在引号包裹、转义字符、跨行字段等特殊规则,手动拆分很容易出错,优先使用csv模块的内置能力处理。
内容的提问来源于stack exchange,提问作者xtlc
相关产品推荐
相关产品推荐

