【问题标题】:How to replace double quotes (") with apostrophes (') when loading a .txt file with Pipe delimited fields in Pandas?在 Pandas 中加载带有管道分隔字段的 .txt 文件时,如何用撇号 (') 替换双引号 (")?
【发布时间】:2021-11-12 20:06:38
【问题描述】:

问题总结

  • 我正在尝试使用 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 笔记本中运行以下命令:

test = pd.read_csv('test.txt', sep ='|')

它会像下面的屏幕截图一样加载文件:

问题

在文件中的示例“note2”和“Note3”中,我希望解决 2 个问题:

note2 问题

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

  • 我应该在使用 bash 命令加载文件之前删除这些文件还是
  • 我应该在使用 Python 在 Jupyter 中加载后删除这些吗?
  • 您能否建议在每种情况下执行此操作的代码以及您会推荐哪一个(以及为什么)?

注意3问题

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

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

感谢您的帮助,非常感谢。

安杰洛

【问题讨论】:

  • 对这两个任务都使用.str.replace()
  • 谢谢@DYZ。这将解决 note2 问题,但在 Note3 中它会中断到另一行。在加载文件之前我该怎么做?
  • 检查this question

标签: python pandas csv jupyter-notebook


【解决方案1】:

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

如果要转换为'" 始终位于字母(单词字符)之间,您可以使用正则表达式(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 ='|')

【讨论】:

  • 感谢您的回答。如果您定义要在 jupyter 中预处理的文本,则此方法有效。在我的情况下,文本是文件的一部分,例如Angelo.txt 并且当我将文件加载到变量时,由于此问题,Note3 已损坏到另一行。所以只是想,在我使用 pd.read_csv 命令之前,我应该在 bash 或 jupyter 中的其他代码中执行它吗?
  • 感谢您提供更新的答案。成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2014-11-16
  • 2020-05-21
相关资源
最近更新 更多