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

Python 如何根据行值将tsv文件拆分为较小的tsv文件,python,python-3.x,Python,Python 3.x,我有一个tsv文件in.txt,我想把它拆分成一个更小的tsv文件out.txt 我只想将第6列中包含字符串值的in.txt行导入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, delimit

我有一个tsv文件
in.txt
,我想把它拆分成一个更小的tsv文件
out.txt

我只想将第6列中包含字符串值的
in.txt
行导入
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
它应该是这样的,带有制表符分隔的值

Drama     Hyn Mok Yoo     A public accountant's salary is far to small for him...etc
试试这个:

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]
试试这个:

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]

您的代码有一些地方出错。让我们一行一行地看这个

import csv
导入模块
csv
。嗯

with open('in.txt','rb') as tsvIn, open('out.txt', 'w') as tsvOut:
    tsvOut = csv.writer(tsvOut)
使用自动关闭的二进制文件从
in.txt
读取句柄
tsvIn
,从
out.txt
读取文本写入句柄
tsvOut
,请执行以下操作。。。(注意:您可能希望使用模式
wb
而不是模式
w
;请参阅)

tsvIn
成为模块
csv
中函数
reader
调用的结果,参数
tsvIn
分隔符='\t'
。嗯

with open('in.txt','rb') as tsvIn, open('out.txt', 'w') as tsvOut:
    tsvOut = csv.writer(tsvOut)
tsvOut
成为模块
csv
中带有参数
tsvOut
的函数
writer
调用的结果。您可能还想添加另一个参数,
delimiter='\t'

    for row in tsvIn:
对于
tsvIn
中作为
行的每个元素,请执行

        if "My String Value" in row:
            tsvOut.writerows(row)
如果字符串
“我的字符串值”
出现在
行中
。您提到您只想显示第六个元素等于字符串的行,因此您应该使用类似这样的内容来代替

        if len(row) >= 6 and row[5] == "My String Value":
            tsvOut.writerow(row)
这意味着:如果
的长度至少为
6
,并且
的第六个元素等于
“我的字符串值”
,请执行

        if "My String Value" in row:
            tsvOut.writerows(row)
使用参数
调用对象
tsvOut
的方法
writerows
。请记住,在Python中,字符串只是一个字符序列,而字符是单个元素字符串。因此,字符是一个序列。然后,根据文档,我们得到了
是一个字符串列表,每个字符串表示该行的一列。因此,行是字符串的列表。然后,我们有
writerows
方法,它需要一个行列表,即字符串列表,即字符序列列表。您可以将
的每个元素解释为一行,而实际上它是一个字符串,而该字符串的每个元素都是一个字符串(因为字符就是字符串!)。所有这一切意味着,您将得到一个混乱的、逐字符的输出。你应该试试这个

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

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

您的代码有一些问题。让我们一行一行地看这个

import csv
导入模块
csv
。嗯

with open('in.txt','rb') as tsvIn, open('out.txt', 'w') as tsvOut:
    tsvOut = csv.writer(tsvOut)
使用自动关闭的二进制文件从
in.txt
读取句柄
tsvIn
,从
out.txt
读取文本写入句柄
tsvOut
,请执行以下操作。。。(注意:您可能希望使用模式
wb
而不是模式
w
;请参阅)

tsvIn
成为模块
csv
中函数
reader
调用的结果,参数
tsvIn
分隔符='\t'
。嗯

with open('in.txt','rb') as tsvIn, open('out.txt', 'w') as tsvOut:
    tsvOut = csv.writer(tsvOut)
tsvOut
成为模块
csv
中带有参数
tsvOut
的函数
writer
调用的结果。您可能还想添加另一个参数,
delimiter='\t'

    for row in tsvIn:
对于
tsvIn
中作为
行的每个元素,请执行

        if "My String Value" in row:
            tsvOut.writerows(row)
如果字符串
“我的字符串值”
出现在
行中
。您提到您只想显示第六个元素等于字符串的行,因此您应该使用类似这样的内容来代替

        if len(row) >= 6 and row[5] == "My String Value":
            tsvOut.writerow(row)
这意味着:如果
的长度至少为
6
,并且
的第六个元素等于
“我的字符串值”
,请执行

        if "My String Value" in row:
            tsvOut.writerows(row)
使用参数
调用对象
tsvOut
的方法
writerows
。请记住,在Python中,字符串只是一个字符序列,而字符是单个元素字符串。因此,字符是一个序列。然后,根据文档,我们得到了
是一个字符串列表,每个字符串表示该行的一列。因此,行是字符串的列表。然后,我们有
writerows
方法,它需要一个行列表,即字符串列表,即字符序列列表。您可以将
的每个元素解释为一行,而实际上它是一个字符串,而该字符串的每个元素都是一个字符串(因为字符就是字符串!)。所有这一切意味着,您将得到一个混乱的、逐字符的输出。你应该试试这个

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

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

open('out.txt','rb')
更改为
open('out.txt','w')
。我现在有一个输出。但单元格值是垂直对齐的,而不是原始文件中的水平对齐。此外,单元格值中的单个字符由制表符分隔。我希望单元格值水平对齐并用制表符分隔。若要写入单行,请使用
writerow()
,而不是
writerows()
。如果您希望在输出文件中使用制表符作为分隔符,那么还需要指定它。将
open('out.txt','rb')
更改为
open('out.txt','w')
。我现在有一个输出。但单元格值是垂直对齐的,而不是原始文件中的水平对齐。此外,单元格值中的单个字符由制表符分隔。我希望单元格值水平对齐并用制表符分隔。若要写入单行,请使用
writerow()
,而不是