我有一个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)
你知道我做错了什么吗?最终文件必须在每个字段和最后的某种换行符之间有一个制表符。
答案 0 :(得分:0)
不知何故,您将字符串传递给w.writerow()
,而不是按预期传递列表。
请记住,字符串是可迭代的;每次迭代都会从字符串中返回一个字符。 writerow()
只是遍历其参数,编写由分隔符字符分隔的每个项目(默认为逗号)。因此,如果您将字符串传递给writerow()
,它将写入由分隔符分隔的字符串中的每个字符。
row
是一个字符串怎么样?可能是输入文件的分隔符不正确 - 可能该文件不使用制表符,但使用空格作为分隔符具有固定的字段宽度。
您可以通过打印row
的值来检查读者是否正确解析了您的文件:
for row in tsvin:
print(row)
...
如果文件被正确解析,期望看到row
是一个列表,并且列表中的每个元素都对应于文件中的列/字段。
如果它没有正确解析,那么您可能会看到row
是一个字符串,或者它是一个列表,但字段是空的和/或不合适。
如果您将输入文件的样本添加到问题中会很有帮助。