首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中将tsv转换为tsv

在python中将tsv转换为tsv
EN

Stack Overflow用户
提问于 2016-02-24 16:46:28
回答 1查看 236关注 0票数 0

我有一个tsv文件(以制表符分隔),在我将其导入postgresql数据库之前,我想使用python过滤掉大量数据。我的问题是,我找不到一种方法来保持原始文件的格式,因为这是强制性的,否则导入过程将无法工作。网站建议我应该使用csv库,但无论我使用什么分隔符,我总是会得到与原始格式不同的文件,例如文件,每个字符后都有一个逗号,每个字符后都有一个制表符,或者文件中所有数据都在一行中。下面是我的代码:

代码语言:javascript
复制
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)    

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

EN

回答 1

Stack Overflow用户

发布于 2016-02-24 17:35:53

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

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

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

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

代码语言:javascript
复制
for row in tsvin:
    print(row)
    ...

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35597261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档