我想删除tsv文件第4列中的所有标点符号,然后保存整个文件。这是我的代码:
import csv
import string
exclude = set(string.punctuation)
with open("test1") as tsvfile:
tsvreader = csv.reader(tsvfile, delimiter="\t")
for line in tsvreader:
line[4] = ''.join(ch for ch in line[4] if ch not in exclude)
tsvfile.close()
上面的代码工作正常,但我的文件没有保存我做的更改。如何在旧文件中保存更改?
答案 0 :(得分:2)
您没有编写任何更改,只是更改每行中的每个第五个元素而不对其执行任何操作,如果要更改原始文件,可以写入tempfile
并执行{{1用更新的temp替换原始文件:
shutil.move
如果要创建新文件而不是更新原始文件,只需打开一个新文件并编写每个已清理的行:
import string
exclude = string.punctuation
from tempfile import NamedTemporaryFile
from shutil import move
with open("test1") as tsvfile, NamedTemporaryFile(dir=".",delete=False) as t:
tsvreader = csv.reader(tsvfile, delimiter="\t")
temp = csv.writer(t,delimiter="\t")
for row in tsvreader:
row[4] = row[4].strip(exclude)
temp.writerow(row)
move(t.name,"test1")
删除标点符号with open("test1") as tsvfile, open("out","w") as t:
tsvreader = csv.reader(tsvfile, delimiter="\t")
temp = csv.writer(t,delimiter="\t")
for row in tsvreader:
row[4] = row[4].strip(exclude)
temp.writerow(row)
就足够了。如果您想从任何地方删除,可以返回str.strip(exclude)
,但如果您要从任何地方删除,则应使用''.join([ch for ch in line[4] if ch not in exclude])
:
str.translate
如果您想添加空格:
row[4] = row[4].translate(None,exclude)
最后,如果您实际上是指第四列,则from string import maketrans
tbl = maketrans(exclude," "*len(exclude))
....
row[4] = row[4].translate(tbl)
不是row[3]
答案 1 :(得分:2)
您说您想要一个新文件,因此您需要打开第二个文件并将清理过的行写入其中:
import csv
import string
exclude = string.punctuation
with open("test1") as tsvfile, open('out.csv') as outfile:
tsvreader = csv.reader(tsvfile, delimiter="\t")
tsvwriter = csv.writer(outfile, delimiter="\t")
for row in tsvreader:
row[4] = row[4].translate(None, string.punctuation)
tsvwriter.writerow(row)
这使用str.translate()
从列中删除所有不需要的标点字符。以上是针对Python 2.对于Python 3,请使用:
row[4] = row[4].translate({ord(c): None for c in string.punctuation})