我正在尝试使用带有两个列的制表符分隔文件,名称和年龄,其中读取为:
'名称\ TAGE \ nMark \ T32 \ nMatt \ T29 \ nJohn \ T67 \ nJason \ T45 \ nMatt \ T12 \ nFrank \ T11 \ nFrank \ T34 \ nFrank \ T65 \ nFrank \ T78 \ N'
只需创建两个列表,一个名称(称为名称,不带标题),另一个列出年龄(称为年龄,但列表中没有年龄)。
答案 0 :(得分:19)
使用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')
答案 1 :(得分:10)
制表符分隔数据位于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']
>>>
答案 2 :(得分:5)
我会使用字符串的split
和splitlines
方法:
names = []
ages = []
for name_age in input.splitlines():
name, age = name_age.strip().split("\t")
names.append(name)
ages.append(age)
如果你正在解析一个更复杂的格式,我会建议使用the csv module,它也可以处理tsv ......但看起来这里有点矫枉过正。
答案 3 :(得分:2)
使用列表理解压缩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')]
答案 4 :(得分:0)
marvin的答案,但没有两次读取整个文件
data = [ (x[0],x[1]) for x in csv.reader(open(filename,'r'),delimiter='\t')]
如果您认为它是元组,则可以使用两个列表
您仍然可以一次通过将数据读取到两个列表中,这将是unubtu的答案