我有一个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
答案 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
中带有参数csv
和tsvIn
的函数delimiter='\t'
的调用结果。确定。
tsvOut = csv.writer(tsvOut)
让tsvOut
成为模块writer
中带有参数csv
的函数tsvOut
的调用结果。您可能还想添加另一个参数delimiter='\t'
。
for row in tsvIn:
对于tsvIn
中row
的每个元素,请执行...
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]