Python 如何根据行值将tsv文件拆分为较小的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
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()
,而不是