在 Pandas 中加载带有竖线分隔字段的 .txt 文件时,如何将双引号 (") 替换为撇号 (')?

How to replace double quotes (") with apostrophes (') when loading a .txt file with Pipe delimited fields in Pandas?

问题总结

示例文件

为了演示我的问题,我创建了一个测试文件,在 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”中有 2 个问题我希望解决:

note2问题

加载文件时如何去掉^M?即,在 Jupyter 中加载时,如何从地址列中删除“\r\r\n”。 “note2”示例应该像这样加载到地址列中:

注3问题

如何用撇号替换字符串表达式中的双引号?在这里它把它分成另一行是不正确的。这应该加载到第 2 行,如下所示:

“Note3”示例是一个复合示例,因为它在字符串中也有“^M”字符,但在这里我有兴趣用撇号替换双引号,这样它就不会分成另一行破坏加载。

非常感谢您的帮助。

安杰洛

如何用撇号替换字符串表达式中的双引号?

如果要转换为 '" 总是在字母(单词字符)之间,您可以按照以下方式使用正则表达式 (re) 预处理文件

import re
txt = '''"Name"|"Surname"|"Address"|"Notes"
"Angelo"|""|"Kenton Square 5"|"Note 1"
"Angelo"|""|"Kenton’s   
Sqr5"|"note2"                    
"Angelo"|""|"Kenton"s
Road"|"Note3"'''
clean_text = re.sub(r'(?<=\w)"(?=\w)', "'", txt)
print(clean_text)

输出

"Name"|"Surname"|"Address"|"Notes"
"Angelo"|""|"Kenton Square 5"|"Note 1"
"Angelo"|""|"Kenton’s   
Sqr5"|"note2"                    
"Angelo"|""|"Kenton's
Road"|"Note3"

解释:使用零长度断言查找在单词字符之后和单词字符之前的"。

如果文件中有文本,首先将其作为文本文件读取,即

with open("test.txt","r") as f:
    txt = f.read()

然后清理它

import re
clean_text = re.sub(r'(?<=\w)"(?=\w)', "'", txt)

然后用io.StringIO放入pandas.DataFrame如下

import io
import pandas as pd
test = pd.read_csv(io.StringIO(clean_text), sep ='|')