我正在遍历一个大(300多个列和1000万个以上的行).txt文件(制表符分隔)。 文件格式:
species 1 ... sample1(11th col) sample2 .... sampleN(353th col)
species 2 ... 6046 5364 ....
species 3 ... 15422 0 ....
每行都是一个物种,从第11列开始,每列都是一个样本。对于每个样本,我想知道该样本中有多少个物种的值大于0。所以我要做的是遍历每行,查看哪些样本的值大于0,如果是,则添加1。对于每个样本,总和1s是值大于0的行总数。
为此,我使用以下代码:
samples = []
OTUnumber = []
with open('all.16S.uniq.txt','r') as file:
for i,line in enumerate(file):
columns = line.strip().split('\t')[11:353]
if i == 0: #headers are sample names so first row
samples = columns #save sample names
OTUnumbers = [0 for s in samples] #set starting value as zero
else:
for n,v in enumerate(columns):
if v > 0:
OTUnumber[n] = OTUnumber[n] + 1
else:
continue
result = dict(zip(samples,OTUnumbers))
运行此代码时,出现以下错误:
TypeError: '>' not supported between instances of 'str' and 'int'
if v > 0
引发此错误。为什么我不能写这句话?
因此,如果列[n]的v> 0,我想在该索引的OTUnumber处加1。如果v <0,我想跳过该行而不添加1(或添加0)。
如何使此代码起作用?
答案 0 :(得分:1)
运行此代码时,出现以下错误:
TypeError: '>' not supported between instances of 'str' and 'int'
如果v > 0
引发此错误。为什么我不能写这句话?
如错误所述,您正在尝试对字符串和int使用比较运算符>
,这是不允许的。 v
是一个字符串,而不是整数。大概您想使用int(v) > 0
而不是v > 0
,或者首先进行以下操作。
columns = [int(v) for v in line.strip().split('\t')[11:353]]
答案 1 :(得分:1)
尝试一下:
samples = []
OTUnumbers = []
with open('all.16S.uniq.txt','r') as file:
for i,line in enumerate(file):
columns = line.strip().split('\t')[11:353]
if i == 0: #headers are sample names so first row
samples = columns #save sample names
OTUnumbers = [0 for s in samples] #set starting value as zero
else:
for n,v in enumerate(columns):
if int(v) > 0:
OTUnumbers[n] = OTUnumbers[n] + 1
else:
continue
result = dict(zip(samples,OTUnumbers))
基本上是2个修复程序:
v
广播到int
OTUnumber
重命名为OTUnumbers
答案 2 :(得分:1)
问题是,在您的文本文件中有记录是字符串,并且您的代码正在尝试将整数与抛出TypeError异常的字符串进行比较
要使代码正常工作,您可以在比较int(v) > 0