名前と年齢の2つの列を持つタブ区切りのファイルを取得しようとしています。これは次のように読み込まれます。
「名前\t年齢\nマーク\t32\nマット\t29\nジョン\t67\nジェイソン\t45\nマット\t12\nフランク\t11\nフランク\t34\nフランク\t65\nフランク\t78\n」
そして、単純に 2 つのリストを作成します。1 つは名前 (名前と呼ばれ、見出しなし) で、もう 1 つは年齢 (年齢と呼ばれますが、リストには年齢がありません) です。
csv モジュールを使用すると、次のようなことができます。
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')
タブ区切りのデータは、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
文字列のandsplitlines
メソッドを使用します。
names = []
ages = []
for name_age in input.splitlines():
name, age = name_age.strip().split("\t")
names.append(name)
ages.append(age)
より複雑な形式を解析する場合は、tsv も処理できるcsv モジュールを使用することをお勧めします。しかし、ここでは少しやり過ぎのようです。
リスト内包表記を使用して圧縮された 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')]