我有一个tsv文件(以制表符分隔),在我将其导入postgresql数据库之前,我想使用python过滤掉大量数据。我的问题是,我找不到一种方法来保持原始文件的格式,因为这是强制性的,否则导入过程将无法工作。网站建议我应该使用csv库,但无论我使用什么分隔符,我总是会得到与原始格式不同的文件,例如文件,每个字符后都有一个逗号,每个字符后都有一个制表符,或者文件中所有数据都在一行中。下面是我的代码:
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) 你知道我做错了什么吗?最终的文件必须在每个字段之间有一个制表符,并在结尾处使用某种换行符。
发布于 2016-02-24 17:35:53
不知何故,您传递给w.writerow()的是一个字符串,而不是预期的列表。
请记住,字符串是可迭代的;每次迭代都返回字符串中的一个字符。writerow()简单地迭代其参数,编写由分隔符(默认情况下是逗号)分隔的每一项。因此,如果您将一个字符串传递给writerow(),它将写入由分隔符分隔的字符串中的每个字符。
为什么row是一个字符串?可能是输入文件的分隔符不正确--可能是文件不使用制表符,而是使用空格作为分隔符的固定字段宽度。
您可以通过打印row的值来检查阅读器是否正确地解析了您的文件
for row in tsvin:
print(row)
...如果文件被正确解析,就会看到row是一个列表,并且列表中的每个元素都对应于文件中的一列/字段。
如果它不能正确解析,那么您可能会看到row是一个字符串,或者它是一个列表,但字段是空的和/或位置不正确。
如果您将输入文件的示例添加到问题中,将会很有帮助。
https://stackoverflow.com/questions/35597261
复制相似问题