python如何读取tsv文件,清理它并保存为新文件?

时间:2015-08-28 00:38:53

标签: python csv

我想删除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()

上面的代码工作正常,但我的文件没有保存我做的更改。如何在旧文件中保存更改?

2 个答案:

答案 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})