【问题标题】:Replace a part of a Python list element替换 Python 列表元素的一部分
【发布时间】:2015-03-03 11:03:42
【问题描述】:

我有一个如下的 csv 文件:

CSV:

H1,H2,H3
A_B,C1,D
F_2j,G,p5

我正在尝试从第一列中删除“_”和数字。这是我尝试过的方法

for i in range(len(max(cols, key=len))):
        transposed = ([(c[i] if i<len(c) else '') for c in cols])
        str(transposed[0]).replace("_",";").split()

它确实替换了“_”,但原始转置后仍打印相同的 csv 文件。如何用旧列替换这个新列?另外,如何仅从 column1 中删除数字以提供以下输出?

期望的输出:

H1,H2,H3
A;B,C1,D
F;j,G,p5

【问题讨论】:

  • 你只想输出或写入另一个文件???
  • @Hackaholic 我只想要输出,因为在此之后我要做更多的处理。

标签: python string list csv replace


【解决方案1】:

这个问题可能是对replace 行为的基本误解 - 它返回修改后的字符串的副本,但不会就地修改字符串。要替换“take”,您必须将其分配回原始字符串。考虑以下几点:

>>> text = 'blah_blah_blah'
>>> print(text.replace('_', ';'))
blah;blah;blah
>>> print(text)
blah_blah_blah

如您所见,replace 调用未触及原始的 text 字符串。要实际修改它:

>>> text = text.replace('_', ';')
>>> print(text)
blah;blah;blah

至于消除数字,您可以在@Hackaholic 的答案中使用基于正则表达式的方法(它也可以很好地处理 '_' 到 ';' 的转换) - 我只是认为这会带来好处阐明replace 字符串方法的行为。

【讨论】:

  • @谢谢。但是当我有多个列并且我只想编辑 column1 时它会起作用吗,因为这样它会替换“文本”中的所有 _ 并再次将其分配给“文本”。
  • @dan,你不能使用普通的 str.replace 来做你想做的事
  • @PadraicCunningham 您删除的答案对我有用。谢谢你。我可能没有正确表达我的问题,但这正是我所需要的。
【解决方案2】:
import csv
import re

with open("in.csv") as f, open("out.csv", "w") as out:
    out.write(next(f))
    r = csv.reader(f, delimiter=",")
    for row in r:
        out.write("{},{}\n".format(re.sub("_\d+|[_\d+]", ";",row[0]), ",".join(row[1:])))

【讨论】:

  • 兄弟为什么不使用 _\d*
  • okie 你也采取了其他可能性,但它不在输入中,但它很好:)
  • @Hackaholic,我认为有任何组合的可能性。这是直到现在还不清楚的一点。 ;)
【解决方案3】:

你可以试试这个:

import re
with open('file.csv') as f:
    for x in f:
        print re.sub("_\d*",';',x)   # here you can store it in variable and do procession on it

输出:

H1,H2,H3
A;B,C1,D
F;j,G,p5 

【讨论】:

  • @PadraicCunningham 我检查了它,它工作正常,它影响标题
【解决方案4】:

我建议使用Python's CSV Module 来读写。这最终可能会简化您已经拥有的许多逻辑。确保您实际上是将行写入文件(我在您的示例代码中没有看到)。我还建议使用正则表达式进行替换和删除:

sub = re.sub("_\d*", ";", my_column)
# use sub as your new column

编辑:我误读了 OP 想要删除数字的内容。何时擦除数字的规则不明确(仅在 _ 字符之后?如果有 _ 则所有数字?)。使用 OP 的示例输出作为规则(“_ 之后的所有数字”)

【讨论】:

  • 如果只有一个数字,它将有效地清空 CSV 文件中的单元格。所以,如果我的行是“1,2,3”,我会得到“,2,3”。这是有效的,只是意味着第一个单元格是空的
  • 没错,我没有看到数字删除依赖于“”。关于何时删除数字的规则是模棱两可的,但如果我们直接在“”之后假设数字,那么这应该在单个 sub 调用中完成,就像其他人建议的那样:“_\d*”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 2021-12-01
  • 2018-11-05
  • 2015-12-29
相关资源
最近更新 更多