如何根据行值将tsv文件拆分为较小的tsv文件

时间:2016-03-18 19:22:28

标签: python python-3.x

我有一个tsv文件in.txt,我希望将其分成一个名为out.txt的较小的tsv文件。

我只想将第6列中包含字符串值in.txt的{​​{1}}行导入My String Value

out.txt

我的输出看起来像这样。

import csv

# r is textmode
# rb is binary mode
# binary mode is faster

with open('in.txt','rb') as tsvIn, open('out.txt', 'w') as tsvOut:
    tsvIn = csv.reader(tsvIn, delimiter='\t')
    tsvOut = csv.writer(tsvOut)

    for row in tsvIn:
        if "My String Value" in row:
            tsvOut.writerows(row)

它应该与制表符分隔值

一样
D,r,a,m,a

1,9,6,1,-,0,4,-,1,3
H,y,u,n, ,M,o,k, ,Y,o,o
B,e,o,m,-,s,e,o,n, ,L,e,e
M,u,-,r,y,o,n,g, ,C,h,o,i,",", ,J,i,n, ,K,y,u, ,K,i,m,",", ,J,e,o,n,g,-,s,u,k, ,M,o,o,n,",", ,A,e,-,j,a, ,S,e,o

A, ,p,u,b,l,i,c, ,a,c,c,o,u,n,t,a,n,t,',s, ,s,a,l,a,r,y, ,i,s, ,f,a,r, ,t,o,o, ,s,m,a,l,l, ,f,o,r, ,h,i,m, ,t,o, ,e,v,e,n, ,g,e,t, ,a, ,c,a,v,i,t,y, ,f,i,x,e,d,",", ,l,e,t, ,a,l,o,n,e, ,s,u,p,p,o,r,t, ,h,i,s, ,f,a,m,i,l,y,., ,H,o,w,e,v,e,r,",", ,h,e, ,m,u,s,t, ,s,o,m,e,h,o,w, ,p,r,o,v,i,d,e, ,f,o,r, ,h,i,s, ,s,e,n,i,l,e,",", ,s,h,e,l,l,-,s,h,o,c,k,e,d, ,m,o,t,h,e,r,",", ,h,i,s, ,.,.,.

K,o,r,e,a,n,",", ,E,n,g,l,i,s,h

S,o,u,t,h, ,K,o,r,e,a

2 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。让我们逐行看看这个......

import csv

导入模块csv。确定。

with open('in.txt','rb') as tsvIn, open('out.txt', 'w') as tsvOut:

使用来自tsvIn的自动关闭二进制文件读取句柄in.txt和来自tsvOut的文本写入句柄out.txt,执行...(注意:您可能希望使用模式wb代替模式w;请参阅this post

    tsvIn = csv.reader(tsvIn, delimiter='\t')

tsvIn成为模块reader中带有参数csvtsvIn的函数delimiter='\t'的调用结果。确定。

    tsvOut = csv.writer(tsvOut)

tsvOut成为模块writer中带有参数csv的函数tsvOut的调用结果。您可能还想添加另一个参数delimiter='\t'

    for row in tsvIn:

对于tsvInrow的每个元素,请执行...

        if "My String Value" in row:

如果"My String Value"中存在字符row。你提到你只想显示第六个元素等于字符串的那些行,所以你应该使用这样的东西......

        if len(row) >= 6 and row[5] == "My String Value":

这意味着:如果row的长度至少为6,且row的第六个元素等于"My String Value",请执行...

            tsvOut.writerows(row)

使用参数writerows调用对象tsvOut的方法row。请记住,在Python中,字符串只是一个字符序列,而字符是单个元素字符串。因此,字符序列。然后,根据文档,我们知道row是一个字符串列表,每个字符串代表一行的列。因此,行是字符串列表。然后,我们有writerows方法,它需要一个行列表,即一个字符串列表列表,即一系列字符序列列表。碰巧你可以将每个row个元素解释为一行,当它实际上是一个字符串时,该字符串的每个元素都是一个字符串(因为字符是字符串!)。所有这些意味着你将获得一个混乱的,逐个字符的输出。你应该试试这个......

            tsvOut.writerow(row)

方法writerow期望单行作为参数,而不是行列表,因此这将产生预期结果。

答案 1 :(得分:1)

试试这个:

import csv

# r is textmode
# rb is binary mode
# binary mode is faster

with open('in.txt','r') as tsvIn, open('out.txt', 'w') as tsvOut:
    reader = csv.reader(tsvIn, delimiter='\t')
    writer = csv.writer(tsvOutm, delimiter='\t')

    [writer.writerow(row) for row in reader if "My String Value" in row]