替换 Python 列表元素的一部分

Replace a part of a Python list element

我有一个如下所示的 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

你可以试试这个:

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 

问题可能是对 replace 行为的基本误解 - 它 returns 修改后的字符串的副本,但不会就地修改字符串。要获得替换 "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 字符串方法的行为。

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

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

编辑:我误读了 OP 想要删除数字的内容。关于何时擦除数字的规则是模棱两可的(仅在 _ 字符之后?如果有 _ 则所有数字?)。使用 OP 的示例输出作为规则 ("all digits after an _")

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:])))