Pandas加载|分隔txt文件时替换双引号为撇号及处理换行符问题
问题原文(翻译)
问题概述
- 我正在尝试用Python的Pandas库加载.txt格式的文件
- 目标.txt文件用
|作为字段分隔符 - 每个字段都用双引号
""包裹为字符串,示例:"i_am_a_string" - 当前存在的问题是:部分字段里本该是撇号的位置被错误写成了双引号,比如无效格式
"I"m_not_a_valid_string",正确的格式应该是"I'm_not_a_valid_string"
示例文件
为了复现问题我创建了测试文件,在vi编辑器中打开后内容如下:
"Name"|"Surname"|"Address"|"Notes"^M "Angelo"|""|"Kenton Square 5"|"Note 1"^M "Angelo"|""|"Kenton’s ^M Sqr5"|"note2"^M "Angelo"|""|"Kenton"s ^M Road"|"Note3"^M
数据加载操作
我在Jupyter notebook中执行如下命令加载文件:
test = pd.read_csv('test.txt', sep ='|')
加载后的效果见对应截图。
待解决问题
我需要解决文件中note2和Note3两个示例对应的两类问题:
note2相关问题
加载文件时怎么去除^M字符?也就是怎么在Jupyter加载后移除Address列的\r\r\n,note2示例的Address列理想加载效果见对应截图。
- 我应该先用bash命令在加载文件前处理该字符,还是加载完成后在Jupyter中用Python处理?
- 请分别给出两种处理方案的代码,并说明推荐方案及对应的原因。
Note3相关问题
怎么将字段内部的双引号替换为撇号?当前该问题会导致字段内容被错误拆分到下一行,造成数据加载错误,Note3示例的理想加载效果见对应截图。
Note3示例同时包含^M字符,但我本次优先需要解决字段内部双引号替换为撇号的问题,避免加载时数据错乱。
解决方案
一、字段内错误双引号替换问题(优先级最高)
该问题会导致Pandas读取时判断字段边界错误,出现列错位、行拆分异常,必须在文件加载前预处理完成。
处理逻辑:合法的双引号仅会出现在行首、行尾,或者分隔符|的前后,所有不符合该位置规则的双引号都是字段内部的错误符号,直接替换为撇号即可,代码如下:
import re import pandas as pd # 读取文件原始内容 with open('test.txt', 'r', encoding='utf-8') as f: raw_content = f.read() # 替换所有字段内部的错误双引号为撇号 fixed_content = re.sub( r'(?<!^)(?<!\|)"(?!\|)(?!$)', "'", raw_content, flags=re.MULTILINE ) # 输出处理后的文件用于后续加载 with open('fixed_test.txt', 'w', encoding='utf-8') as f: f.write(fixed_content)
处理完成后再读取文件,不会再出现数据错位问题。
二、^M(即\r回车符)处理问题
两种处理方案均可,具体实现和优缺点如下:
方案1:Bash预处理(加载前处理)
适合Linux/macOS环境,执行命令直接替换即可:
# 方法1:用dos2unix直接转换换行格式(需提前安装dos2unix) dos2unix test.txt # 方法2:用sed直接替换所有\r字符,无需额外安装工具 sed -i 's/\r//g' test.txt
- 优点:处理速度快,资源消耗低,适合1G以上的超大文件
- 缺点:依赖Unix环境,原生Windows系统无法直接运行
方案2:Python加载后处理
全Python链路,跨平台兼容性好:
# 读取文件时指定换行符为\n,自动过滤\r test = pd.read_csv('fixed_test.txt', sep='|', lineterminator='\n') # 对所有字符串类型的列,批量替换多余的换行、回车符为空格 str_columns = test.select_dtypes(include='object').columns test[str_columns] = test[str_columns].replace(r'[\r\n]+', ' ', regex=True)
- 优点:不需要切换环境执行命令,代码链路统一,Windows、Linux、macOS均可直接运行
- 缺点:超大文件处理速度略低于Bash方案
推荐方案
如果运行环境为Linux/macOS且文件体积大于1G,优先选Bash预处理;其他场景优先选Python处理,维护成本更低。
内容的提问来源于stack exchange,提问作者Angelo
相关产品推荐
相关产品推荐

