替换 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:])))
我有一个如下所示的 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:])))