【问题标题】:Converting tsv to tsv in python在python中将tsv转换为tsv
【发布时间】:2016-06-06 10:53:59
【问题描述】:

我有一个 tsv 文件(制表符分隔),并且想在将大量数据导入到 postgresql 数据库之前使用 python 过滤掉大量数据。 我的问题是我找不到保留原始文件格式的方法,这是强制性的,否则导入过程将无法正常工作。 网络建议我应该使用 csv 库,但无论我使用什么定界符,我最终都会得到与原始格式不同的文件,例如。 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)    

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

【问题讨论】:

标签: python postgresql csv


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的帮助,mhawke。我查了一下,row 实际上是一个列表。我要玩一下定界符。可能这就是错误的原因。
  • @Otterfinger:如果它是一个列表,那么writerow() 应该可以正常工作。您可以发布输入 CSV 的示例吗?...答案可能就在那里,这将使其他用户有机会复制您所看到的问题。
猜你喜欢
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多