在python中将tsv转换为tsv

时间:2016-02-24 08:46:28

标签: python postgresql csv

我有一个tsv文件(tab-seperated),并希望在将其导入postgresql数据库之前使用python过滤掉大量数据。 我的问题是我无法找到保留原始文件格式的方法,因为否则导入过程不会起作用。 网络建议我应该使用csv库,但无论我使用什么分隔符,我总是以不同于原点的格式结束文件,e。 G。文件,在每个字符或文件后面都包含一个逗号,在每个字符或一行中包含所有数据的文件之后包含一个选项卡。 这是我的代码:

import csv
import glob

# create a list of all tsv-files in one directory
liste = glob.glob("/some_directory/*.tsv")

# go thru all the files
for item in liste:
    #open the tsv-file for reading and a file for writing   
    with open(item, 'r') as tsvin, open('/some_directory/new.tsv', 'w') as csvout:
    tsvin = csv.reader(tsvin, delimiter='\t')
    # I am not sure if I have to enter a delimter here for the outfile. If I enter "delimter='\t'" like for the In-File, the outfile ends up with a tab after every character
    writer = csv.writer(csvout)

# go thru all lines of the input tsv
    for row in tsvin:
        # do some filtering
        if 'some_substring1' in row[4] or 'some_substring2' in row[4]:
            #do some more filtering
            if 'some_substring1' in str(row[9]) or 'some_substring1' in str(row[9]):
            # now I get lost...
            writer.writerow(row)    

你知道我做错了什么吗?最终文件必须在每个字段和最后的某种换行符之间有一个制表符。

1 个答案:

答案 0 :(得分:0)

不知何故,您将字符串传递给w.writerow(),而不是按预期传递列表。

请记住,字符串是可迭代的;每次迭代都会从字符串中返回一个字符。 writerow()只是遍历其参数,编写由分隔符字符分隔的每个项目(默认为逗号)。因此,如果您将字符串传递给writerow(),它将写入由分隔符分隔的字符串中的每个字符。

row是一个字符串怎么样?可能是输入文件的分隔符不正确 - 可能该文件不使用制表符,但使用空格作为分隔符具有固定的字段宽度。

您可以通过打印row的值来检查读者是否正确解析了您的文件:

for row in tsvin:
    print(row)
    ...

如果文件被正确解析,期望看到row是一个列表,并且列表中的每个元素都对应于文件中的列/字段。

如果它没有正确解析,那么您可能会看到row是一个字符串,或者它是一个列表,但字段是空的和/或不合适。

如果您将输入文件的样本添加到问题中会很有帮助。