35

Python でタブ区切りファイルを解析しようとしています。ここでは、行の先頭から k タブ離れた数を k 番目の配列に配置する必要があります。

これを行うための組み込み関数、または行ごとに読み取り、単純なソリューションが実行するすべての明白な処理を行う以外のより良い方法はありますか?

4

4 に答える 4

67

モジュールを使用して、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()組み込みを使用するのが最善の方法です。

with open("tab-separated-values") as tsv:
    for column in zip(*[line for line in csv.reader(tsv, dialect="excel-tab")]):
        ...
于 2012-06-15T23:39:36.920 に答える
14

現在の回答のいずれも、あなたが望んでいることを実際に行っているとは思いません。(訂正: @Gareth Latty / @Lattyware が私の回答を最後近くの「編集」として彼自身の回答に組み込んだことがわかりました。)

とにかく、ここに私の見解があります:

これらが入力ファイルのタブ区切りの値であるとします。

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 inp:
    print( list(zip(*(line.strip().split('\t') for line in inp))) )

以下を生成します。

[('1', '6', '11', '16'), 
 ('2', '7', '12', '17'), 
 ('3', '8', '13', '18'), 
 ('4', '9', '14', '19'), 
 ('5', '10', '15', '20')]

ご覧のとおり、各行の k 番目の要素が k 番目の配列に配置されます。

于 2012-06-16T04:18:49.270 に答える
5

このような:

>>> 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 モジュールを使用します...

于 2012-06-15T23:37:26.400 に答える