J'essaie d'analyser un fichier séparé par des tabulations dans Python où un nombre placé k tabulations en dehors du début d'une ligne, devrait être placé dans le k-ème tableau.
Y a-t-il une fonction intégrée pour faire cela, ou une meilleure façon, autre que la lecture ligne par ligne et faire tout le traitement évident qu'une solution naïve effectuerait?
Vous pouvez utiliser le module csv
pour analyser facilement les fichiers de valeurs séparés par tabulation.
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.
...
Où line
est une liste des valeurs de la ligne actuelle pour chaque itération.
Edit: Comme suggéré ci-dessous, si vous voulez lire par colonne, et non par ligne, alors la meilleure chose à faire est d'utiliser la fonction intégrée Zip()
:
with open("tab-separated-values") as tsv:
for column in Zip(*[line for line in csv.reader(tsv, dialect="Excel-tab")]):
...
Je pense qu'aucune des réponses actuelles ne fait vraiment ce que vous avez dit vouloir. (Correction: je vois maintenant que @Gareth Latty/@Lattyware a incorporé ma réponse dans la sienne en tant que "Édition" vers la fin.)
Quoi qu'il en soit, voici mon point de vue:
Dites que ce sont les valeurs séparées par des tabulations dans votre fichier d'entrée:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
ensuite ceci:
with open("tab-separated-values.txt") as inp:
print( list(Zip(*(line.strip().split('\t') for line in inp))) )
produirait ce qui suit:
[('1', '6', '11', '16'),
('2', '7', '12', '17'),
('3', '8', '13', '18'),
('4', '9', '14', '19'),
('5', '10', '15', '20')]
Comme vous pouvez le voir, il place le k-ème élément de chaque ligne dans le k-ème tableau.
Comme ça:
>>> s='1\t2\t3\t4\t5'
>>> [x for x in s.split('\t')]
['1', '2', '3', '4', '5']
Pour un fichier:
# 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
Si vous souhaitez que l'entrée soit transposée:
>>> with open('tabs.txt','r') as f:
... LoT=Zip(*(line.strip().split('\t') for line in f))
...
>>> LoT[2][3]
'32'
Ou (mieux encore) utilisez le module csv dans la distribution par défaut ...