我試圖採取製表符分隔的文件有兩列,姓名和年齡,因爲這其中讀取:解析製表符分隔的文件轉換成不同的列表或字符串
「名稱\踏歌\ nMark \ T32 \ nMatt \ t29 \ nJohn \ t67 \ nJason \ t45 \ nMatt \ t12 \ nFrank \ t11 \ nFrank \ t34 \ nFrank \ t65 \ nFrank \ t78 \ n'
只需創建兩個名單,沒有標題)和一個與年齡(稱爲年齡,但在列表中沒有年齡)。
我試圖採取製表符分隔的文件有兩列,姓名和年齡,因爲這其中讀取:解析製表符分隔的文件轉換成不同的列表或字符串
「名稱\踏歌\ nMark \ T32 \ nMatt \ t29 \ nJohn \ t67 \ nJason \ t45 \ nMatt \ t12 \ nFrank \ t11 \ nFrank \ t34 \ nFrank \ t65 \ nFrank \ t78 \ n'
只需創建兩個名單,沒有標題)和一個與年齡(稱爲年齡,但在列表中沒有年齡)。
我會用字符串的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 ......但好像這將是這裏有點矯枉過正。
使用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')
製表符分隔的數據是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']
>>>
使用列表理解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')]