2014-12-29 2 views
1

Я разбираю файл (файл .GTF), и теперь у меня есть проблема с его экспортом в текстовый файл. До сих пор я сделал список списков, который так же, как это:экспорт анализируемого файла в текстовый файл в python

pl = [ 
    [' id "ENS001" ', ' name "EGSB" ', ' Trans "TTP" ', ' ' ], 
    [' id "EN02" ', ' name "EHGT" ', ' Trans "GFT" ', ' ' ] 
] 

конечно, длина вложенных списков равна (16) и есть 111559 вложенные списки внутри родительского списка. Как видно из приведенного выше примера, вложенные списки имеют несколько пар, и каждая пара имеет 2 единицы, разделенных вкладкой.

В моем текстовом файле каждый вложенный список будет строкой (только вторая единица каждой пары), и каждый элемент в ней будет содержать столбцы. Первые единицы аналогичны во всех вложенных списках, и они будут именами столбцов, поэтому они не находятся в строках. Более того, мне нужны только первые 8 элементов (из 16) каждого вложенного списка. Также я использую python 2.6.6. Мне нужен такой файл.

id  name Trans 

ENS001 EGSB TTP 

EN02 EHGT GFT 
+1

Любой конкретная ошибка в коде? – BorrajaX

+0

Вы можете пропустить свой родительский список и написать вывод с помощью модуля [csv] (https://docs.python.org/2/library/csv.html) – TobiMarg

+3

«У меня возникла проблема с его экспортом в текстовый файл «. - какая проблема? Вы получаете сообщение об ошибке? Одно из наблюдений, а не список списков, вам может быть лучше со списком словарей, где «id», «name» и «Trans» являются ключами. Форматирование строк см. В методе 'format'. – cdarke

ответ

4

Сначала вы можете разделить ваш список с shlex удалить кавычки:

>>> l=[[shlex.split(i) for i in t i!=' '] for t in pl] 

[[['id', 'ENS001'], ['name', 'EGSB'], ['Trans', 'TTP']], [['id', 'EN02'], ['name', 'EHGT'], ['Trans', 'GFT']]] 

затем zip ваш внутренний список, чтобы получить следующее:

>>> z= [zip(*i) for i in l] 
[[('id', 'name', 'Trans'), ('ENS001', 'EGSB', 'TTP')], [('id', 'name', 'Trans'), ('EN02', 'EHGT', 'GFT')]] 

затем получить строки:

>>> rows= [i[1] for i in z] 
[('ENS001', 'EGSB', 'TTP'), ('EN02', 'EHGT', 'GFT')] 

наконец записать данные в файл:

with open('out.txt','w') as f : 
    f.write (' '.join(z[0][0])+'\n') 
    for i in rows: 
     f.write (' '.join(i)+'\n') 

Но более эффективным способом вы можете поместить все список comprehensives к одному и отказаться от хранения их отдельно:

rows=[zip(*i) for i in [[shlex.split(i) for i in t if i!=' '] for t in pl]] 
with open('out.txt','w') as f : 
    f.write (' '.join(rows[0][0])+'\n') 
    for i in rows: 
     f.write (' '.join(i[1])+'\n') 
+0

Когда я запустил эту строку, он дал мне много пустых списков: z = [zip (* i) для i in l] – ali

+0

вы запустили первую команду? – Kasramvd

+0

Конечно, строка = может быть сведена к одному единственному выражению: [zip (* j) [1] для j в [[shlex.split (i) для i в t] для t в pl]] ... но это находится на пределе того, что я предлагаю для сложности понимания списка. –

Смежные вопросы