替换Python列表元素的一部分

时间:2015-01-05 20:37:36

标签: python string list csv replace

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

4 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

你可以试试这个:

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 

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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