在 Pandas 中加载带有竖线分隔字段的 .txt 文件时,如何将双引号 (") 替换为撇号 (')?
How to replace double quotes (") with apostrophes (') when loading a .txt file with Pipe delimited fields in Pandas?
问题总结
- 我正在尝试使用 Pandas 在 Python 中加载 .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”中有 2 个问题我希望解决:
note2问题
加载文件时如何去掉^M?即,在 Jupyter 中加载时,如何从地址列中删除“\r\r\n”。 “note2”示例应该像这样加载到地址列中:
- 我应该在使用 bash 命令或
加载文件之前删除它们吗
- 在使用 Python 将其加载到 Jupyter 后,我是否应该删除这些?
- 您能否建议在每种情况下执行此操作的代码,您会推荐哪一个(以及为什么)?
注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 ='|')
问题总结
- 我正在尝试使用 Pandas 在 Python 中加载 .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”中有 2 个问题我希望解决:
note2问题
加载文件时如何去掉^M?即,在 Jupyter 中加载时,如何从地址列中删除“\r\r\n”。 “note2”示例应该像这样加载到地址列中:
- 我应该在使用 bash 命令或 加载文件之前删除它们吗
- 在使用 Python 将其加载到 Jupyter 后,我是否应该删除这些?
- 您能否建议在每种情况下执行此操作的代码,您会推荐哪一个(以及为什么)?
注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 ='|')