如何处理无扩展名文件中引号内的|以转换为Python DataFrame
解决方法
不需要手动修改文件,用Python结合正则表达式批量处理引号内的|,再读取为DataFrame即可,步骤如下:
1. 处理文件内容
使用正则匹配所有被双引号包裹的字段,移除其中的|:
import re import pandas as pd from io import StringIO # 读取原始文件内容 with open("your_file", "r", encoding="utf-8") as f: raw_content = f.read() # 替换双引号内的|为空 processed_content = re.sub( r'"([^"]+)"', lambda match: match.group(0).replace("|", ""), raw_content )
2. 读取为DataFrame
处理后的内容可以直接通过StringIO在内存中读取,避免生成中间文件:
# 读取为DataFrame,指定分隔符为|,跳过字段前的空格 df = pd.read_csv( StringIO(processed_content), sep="|", skipinitialspace=True, na_filter=False # 避免把空列解析为NaN,可根据需求调整 ) print(df.head())
效果说明
你的示例行处理后会变成:
Details|145|Sam's Garden|Retail|12.0|"It's a nice garden"| USD|||||||||||||||||||||||||||
Details|200|That's my thing|Retail|23.4|"Not so great"|EUR|||||||||||||||||||||||||||
此时用sep="|"读取时,引号内的内容会被识别为单个字段,不会出现列数不匹配的问题。
正则说明
r'"([^"]+)"' 用于匹配所有成对双引号包裹的内容:
"匹配起始双引号[^"]+匹配任意非双引号的字符(确保只匹配到闭合的引号)"匹配结束双引号
lambda函数会对每个匹配到的字段,仅替换其中的|,保留其他内容和双引号本身。
内容的提问来源于stack exchange,提问作者Pythonless
相关产品推荐
相关产品推荐

