Анализ файла, разделенного табуляцией, с пропущенными полями - PullRequest
4 голосов
/ 15 ноября 2011

Это пример файла со сложной вкладкой, который я пытаюсь проанализировать

ENTRY   map0010\tNAME Glycolysis\tDESCRIPTION Glycolysis is the process of converting glucose into pyruvate\tCLASS   Metabolism\tDISEASE   H00071  Hereditary fructose intolerance\tH00072  Pyruvate dehydrogenase complex deficiency\tDBLINKS     GO: 0006096 0006094
ENTRY   map00020\tNAME  Citrate cycle (TCA cycle)\tCLASS   Metabolism; Carbohydrate Metabolism\tDISEASE   H00073  Pyruvate carboxylase deficiency\tDBLINKS     GO: 0006099\tREL_PATHWAY map00010  Glycolysis / Gluconeogenesis\tmap00053  Ascorbate and aldarate metabolism

Я пытаюсь получить вывод, содержащий только некоторые поля, например:

ENTRY   map0010\tNAME Glycolysis\tCLASS   Metabolism\tDISEASE   H00071  Hereditary fructose intolerance H00072  Pyruvate dehydrogenase complex deficiency\tDBLINKS     GO: 0006096 0006094\tNA
ENTRY   map00020\tNAME  Citrate cycle (TCA cycle)\tCLASS   Metabolism; Carbohydrate Metabolism\tDISEASE   H00073  Pyruvate carboxylase deficiency\tDBLINKS     GO: 0006099\tREL_PATHWAY map00010  Glycolysis / Gluconeogenesis\tmap00053  Ascorbate and aldarate metabolism

Основная проблема заключается в том, что не все строки содержат одинаковое количество полей, поэтому мне нужно удалить, например, поля, содержащие строку «ОПИСАНИЕ», и добавить пустое поле в строки, где находится поле «КЛАСС» "нет

Более того, для некоторых полей данные разбиты более чем на одно (например, в строке 1 поле, следующее за DISEASE, содержит данные о заболеваниях!), И мне нужно присоединиться к ним.

Я пробовал с:

input = open('file', 'r')

dict = ["ENTRY", "NAME", "CLASS", "DISEASE", "DBLINKS", "REL_PATHWAY"]

split_tab = []
output = []

for line in input:
    split_tab.append(line.split('\t'))

for item in dict:
    for element in split_tab:
        if item in element:
            output.append(element)
        else:
            output.append('\tNA\t')

Но он хранит все, не только элементы, указанные в dict. Не могли бы вы помочь мне?

Ответы [ 3 ]

6 голосов
/ 15 ноября 2011

Используйте встроенную библиотеку csv . Ваша работа будет намного проще.

Для некоторого примера кода:

import csv
reader = csv.reader(open('myfile.csv', 'rb'), dialect='excel-tab')
fieldnames = ['Name','Class']
writer = csv.DictWriter(open('myfile.csv', 'rb'), fieldnames, restval='', extrasaction='ignore', dialect='excel-tab')

for row in reader:
    newrow = {}
    for field in row:
        key = field.split(' ', 1)[0]
        newrow[key] = field
    writer.writerow(newrow)

Обратите особое внимание на то, как настроен DictWriter. Это намного проще в использовании, если вы включите поля restval и extrasaction. Они позволяют передавать словарь с большим или меньшим значением, чем ожидает автор.

Просто правильно установите имена полей и настройте ридер на использование правильного диалекта. Это может включать добавление вашего собственного, но ссылка csv содержит инструкции, как это сделать.

EDIT

После комментария Роба, опубликованного ниже, я пересмотрел его, чтобы учесть тот факт, что диалекты CSV не так сильны, как я думал.

3 голосов
/ 15 ноября 2011
requiredKeys = 'ENTRY NAME CLASS DISEASE DBLINKS REL_PATHWAY'.split(' ')

for line in open('file', 'r'):
    fields = line.split('\t')
    fieldMap = {}
    for field in fields:
        key = field.split(' ', 1)[0]
        fieldMap[key] = field
    print '\t'.join([fieldMap.get(key, 'NA') for key in requiredKeys])
2 голосов
/ 15 ноября 2011

Ваша линия

split_tab.append (line.split ( '\ т'))

все портит. Вы делаете список внутри списка. попробуйте это вместо:

split_tab = line.split ('\ t')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...