【问题标题】:Pandas - How to replace a single quotation mark followed by a comma ( ", )Pandas - 如何替换单引号后跟逗号(“,”)
【发布时间】:2021-08-17 21:15:51
【问题描述】:

我有一个如下所示的文本文件:

,Symbol,Date"+
",DRI,23/04/2021"+
",CQN,28/04/2021"+
",TGG,29/01/2021"+

我想要这样的结果:

"Symbol,Date"+
"DRI,23/04/2021"+
"CQN,28/04/2021"+
"TGG,29/01/2021"

我正在使用 pandas 将 csv 转换为上面的文本文件,但我在 (",) 之后得到了这个带逗号的单双引号,我只想用一个单双引号 (") 替换它。

在下面的代码中:

df = pd.read_csv(in_csv, na_filter=False, encoding='utf-8-sig')

    # dict of replacements
replacements = {
    '"",': '"'
}

    # using the replace() method
df1 = df.replace(replacements, regex=True)

我尝试了许多可能的解决方案,例如

1. '\"' to '"' 
2. """," to """"
3. '\""," to '"'
...

但似乎没有一个工作。在记事本中使用查找和替换很容易,但我需要仅使用代码来自动执行此任务。 我还纠结于如何只删除第一个逗号和最后一个 (+) 号而不影响其余部分。

您能提出解决我遇到的这个问题的方法吗?

【问题讨论】:

  • 您可以读取文件、写入列表、截断文件、进行更改,然后再次写入文件。
  • @sean-william 请尽量不要在你写的每个句子中使用 html 标签。它使帖子不仅难以阅读,而且看起来不成熟。您想强调某件事,确保它只是需要绝对关注的最具体的项目。
  • 我认为它看起来比纯文本更容易阅读:(我会研究这个
  • @Sujay 谢谢你的建议。我正在尝试看看它是否适合我

标签: python pandas csv replace


【解决方案1】:

另一种选择是使用带有 lambda 的模式进行替换,并使用 StringIO 加载字符串

如果组 1 存在(最后一个加号),则返回一个空字符串。否则返回双引号。

^"?,+|(\+)\Z
  • ^行首
  • "?,+ 匹配可选的双引号和 1 个或多个逗号
  • |或者
  • (\+)组 1 中捕获加号
  • \Z 字符串结束

Regex demo

例如

import re
import pandas as pd
from io import StringIO

with open('file', 'r') as file:
    lines = file.read()
    pattern = r"^\"?,+|(\+)\Z"
    data = re.sub(pattern, lambda m: "" if m.group(1) else '"', lines, 0, re.MULTILINE)
    df = pd.read_csv(StringIO(data), na_filter=False, encoding='utf-8-sig')
    print(df)

输出

      Symbol,Date+
0  DRI,23/04/2021+
1  CQN,28/04/2021+
2   TGG,29/01/2021

【讨论】:

  • 感谢您的解决方案!我想我需要更多地复习我的正则表达式!
  • @SeanWilliam 欢迎您。如果发布的任何答案帮助您解决了问题,请参阅someone answers
【解决方案2】:

如果您对非 python 解决方案持开放态度,sed 可以轻松完成这项工作:)

sed -e 's/^",/,/g' -e 's/^,/"/g' -e '$ s/+$//g' test.txt
  1. 's/^",/,/g', 替换以", 开头的第一行
  2. 's/^,/"/g' 将所有以 , 开头的内容替换为 "
  3. '$ s/+$//g' 删除最后一行的 + 符号,位于行尾。 sed 有地址的概念,$ 表示最后一行。

在某些系统上,您可能必须使用sed -i -e

【讨论】:

  • 感谢您的建议!
【解决方案3】:

这里不需要熊猫。该文件不是 csv 文件,而是纯文本文件,因此您可以使用:

  • re 模块更改行的开头和最后一行的结尾。在遍历行之前编译正则表达式会更有效
  • 常见的对临时文件进行读写模式,常用于修改文本文件。保留前一行是轻松识别最后一行的简单方法。

可能是:

import re
import os

infile = 'ess.txt'
tmpfile = infile + '.tmp'

# pre-compile the regular expressions
init = re.compile(r'^"?,')
last = re.compile(r'"\+\s*$')

with open(infile) as fd, open(tmpfile, 'w') as out:
    old = None
    for line in fd:
        if len(line.strip()) == 0:  # skip empty lines
            continue
        if old is not None:
            out.write(old)
        old = init.sub('"', line)
    out.write(last.sub('"\n', old))

os.remove(infile)
os.rename(tempfile, infile)

【讨论】:

  • 非常感谢您!这对我帮助很大!
猜你喜欢
  • 1970-01-01
  • 2017-06-20
  • 2022-01-02
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
相关资源
最近更新 更多