Разбор файла с разделителями табуляции в Python
Я пытаюсь разобрать файл с разделителями табуляции в Python, где число, размещенное на вкладках k, отличное от начала строки, должно быть помещено в k-й массив.
Есть ли встроенная функция для этого или лучший способ, кроме чтения строки за строкой, и выполнить всю очевидную обработку наивного решения?
Ответы
Ответ 1
Вы можете использовать модуль csv
для простого разбора разделенных файлов значений.
import csv
with open("tab-separated-values") as tsv:
for line in csv.reader(tsv, dialect="excel-tab"): #You can also use delimiter="\t" rather than giving a dialect.
...
Где line
- список значений текущей строки для каждой итерации.
Изменить: как предлагается ниже, если вы хотите читать по столбцу, а не по строке, то лучше всего использовать zip()
builtin:
with open("tab-separated-values") as tsv:
for column in zip(*[line for line in csv.reader(tsv, dialect="excel-tab")]):
...
Ответ 2
Я не думаю, что любой из текущих ответов действительно делает то, что вы сказали, что хотите.
Итак, вот мое взятие:
Скажите, что это значения, разделенные табуляцией в вашем входном файле:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
то это:
with open("tab-separated-values.txt") as input:
print zip(*(line.strip().split('\t') for line in input))
создаст следующее:
[('1', '6', '11', '16'),
('2', '7', '12', '17'),
('3', '8', '13', '18'),
('4', '9', '14', '19'),
('5', '10', '15', '20')]
Как вы можете видеть, он помещает k-й элемент каждой строки в k-й массив.
Ответ 3
Вот так:
>>> s='1\t2\t3\t4\t5'
>>> [x for x in s.split('\t')]
['1', '2', '3', '4', '5']
Для файла:
# create test file:
>>> with open('tabs.txt','w') as o:
... s='\n'.join(['\t'.join(map(str,range(i,i+10))) for i in [0,10,20,30]])
... print >>o, s
#read that file:
>>> with open('tabs.txt','r') as f:
... LoL=[x.strip().split('\t') for x in f]
...
>>> LoL
[['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
['10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
['20', '21', '22', '23', '24', '25', '26', '27', '28', '29'],
['30', '31', '32', '33', '34', '35', '36', '37', '38', '39']]
>>> LoL[2][3]
23
Если вы хотите, чтобы вход был транспонирован:
>>> with open('tabs.txt','r') as f:
... LoT=zip(*(line.strip().split('\t') for line in f))
...
>>> LoT[2][3]
'32'
Или (еще лучше) используйте модуль csv в дистрибутиве по умолчанию...