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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:39:01