Я перебираю большой (300+ столбцов и 1 000 000+ строк) .txt файл (с разделителями табуляции). формат файла:

species 1    ...    sample1(11th col)    sample2    ....    sampleN(353th col)
species 2    ...    6046                 5364               ....
species 3    ...    15422                0                  ....

Каждая строка представляет собой вид, и начиная со столбца 11 и далее каждый столбец является образцом. Для каждого образца я хочу знать, сколько видов в этом образце имеют значение больше 0. Итак, я делаю итерацию по каждой строке, вижу, для каких образцов значение больше 0, и если да, добавьте 1. для каждой выборки общая сумма 1 с - это общее количество строк, значение которых больше 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))

Когда я запускаю этот код, я получаю следующую ошибку: {{Х0}} Эта ошибка возникает if v > 0. Почему я не могу написать это заявление?

Поэтому, если v столбцов [n]> 0, я хочу добавить 1 к OTUnumber по этому индексу. Если v <0, я хочу пропустить эту строку и не добавлять 1 (или добавлять 0).

Как я могу заставить этот код работать?

1
Robvh 24 Июн 2019 в 16:54

3 ответа

Лучший ответ

Когда я запускаю этот код, я получаю следующую ошибку: 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
Mees de Vries 24 Июн 2019 в 13:58

Попробуй это:

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 во всем коде
1
Adam.Er8 24 Июн 2019 в 14:01

Дело в том, что в вашем текстовом файле есть записи, которые являются строками, и ваш код пытается сравнить целое число со строкой, которая выдает исключение TypeError

Чтобы заставить код работать, вы можете преобразовать свою запись в int перед сравнением, т.е. int(v) > 0

1
Shanmukh 24 Июн 2019 в 14:02