web-dev-qa-db-ja.com

タブ区切りファイルを個別のリストまたは文字列に解析する

次のように読み込まれる、名前と年齢の2つの列があるタブ区切りファイルを取得しようとしています。

'名前\ tAge\nMark\t32\nMatt\t29\nJohn\t67\nJason\t45\nMatt\t12\nFrank\t11\nFrank\t34\nFrank\t65\nFrank\t78\n'

そして、2つのリストを作成します。1つは名前(見出しなしの名前と呼ばれる)ともう1つは年齢(年齢と呼ばれますが、リストには年齢なし)です。

15
user972297

csv module を使用すると、次のようになります。

import csv

names=[]
ages=[]
with open('data.csv','r') as f:
    next(f) # skip headings
    reader=csv.reader(f,delimiter='\t')
    for name,age in reader:
        names.append(name)
        ages.append(age) 

print(names)
# ('Mark', 'Matt', 'John', 'Jason', 'Matt', 'Frank', 'Frank', 'Frank', 'Frank')
print(ages)
# ('32', '29', '67', '45', '12', '11', '34', '65', '78')
19
unutbu

タブ区切りデータはcsvモジュールのドメイン内にあります:

>>> corpus = 'Name\tAge\nMark\t32\nMatt\t29\nJohn\t67\nJason\t45\nMatt\t12\nFrank\t11\nFrank\t34\nFrank\t65\nFrank\t78\n'
>>> import StringIO
>>> infile = StringIO.StringIO(corpus)

ふりinfileは通常のfile...

>>> import csv
>>> r = csv.DictReader(infile, 
...                    dialect=csv.Sniffer().sniff(infile.read(1000)))
>>> infile.seek(0)

csvモジュールに見出しと区切り記号の形式を教える必要さえありません。それはそれ自体で理解します

>>> names, ages = [],[]
>>> for row in r:
...     names.append(row['Name'])
...     ages.append(row['Age'])
... 
>>> names
['Mark', 'Matt', 'John', 'Jason', 'Matt', 'Frank', 'Frank', 'Frank', 'Frank']
>>> ages
['32', '29', '67', '45', '12', '11', '34', '65', '78']
>>> 

文字列のsplitおよびsplitlinesメソッドを使用します。

names = []
ages = []
for name_age in input.splitlines():
    name, age = name_age.strip().split("\t")
    names.append(name)
    ages.append(age)

より複雑な形式を解析する場合は、tsvも処理できる csvモジュール を使用することをお勧めします…しかし、ここでは少々やり過ぎのようです。

5
David Wolever

リスト内包表記を使用して圧縮されたUnutbuの答え:

names = [x[0] for x in csv.reader(open(filename,'r'),delimiter='\t')]
ages = [x[1] for x in csv.reader(open(filename,'r'),delimiter='\t')]
2
marvin

marvinの答えですが、ファイル全体を2回読み取ることはありません

data = [ (x[0],x[1]) for x in csv.reader(open(filename,'r'),delimiter='\t')]

2つのリストではなく、タプルを使用することに問題がない場合

あなたはまだ単一のパスで2つのリストにデータを読み込むことができ、それはunubtuの答えになるでしょう

0
StevenWernerCS