Python将制表符文本文件读取为多个列表
你好,作为一个刚接触Python的新手,我希望能得到一些帮助,解决我面临的编程挑战:
我有一个文本文件,里面是用制表符分隔的数据,我想读取这个文件,并把每一行的数值放到不同的Python列表里。
这个文件的内容是这样的:
1 303233.479 233942.326 52.500 0.000 97 47 39.5 INFINITY 0.00034 0.00000 PBT PBT A001 B001
2 303386.031 233921.445 52.553 153.975 97 47 39.5 INFINITY 0.00034 0.00000 TS A001
3 303397.931 233919.897 52.557 165.975 96 38 54.2 -300.000 0.00034 0.00000 SC A002
4 303405.224 233919.137 52.559 173.308 95 14 52.6 -300.000 0.00034 6.25000 PC B002
文件里有13列数据,我想把这些值放到13个列表里。我知道怎么处理几列数据,但对于13列的数据,我有点不知道该怎么做。
#Here is my pathetic attempt at this
pntnums = [] #a
xcogo = [] #b
ycogo = [] #c
zcogo = [] #d
chain = [] #e
bearing = [] #f
rad = [] #g
grad = [] #h
mval = [] #i
HCOD = [] #j
VCOD = [] #k
fd = file("align.txt").readlines():
a, b, c, d, e, f, g, h, i, j, k, = [int(s) for s in l.split()]
pntnums.append(int(a))
xcogo.append(int(b))
ycogo.append(int(c))
zcogo.append(int(d))
chain.append(int(e))
bearing.append(int(f))
rad.append(int(g))
grad.append(int(h))
mval.append(int(i))
HCOD.append(int(j))
VCOD.append(int(k))
for val in pntnums:
print val
#and the corresponding output:
Traceback (most recent call last):
File "C:\MYPY\test.py", line 2, in <module>
dataDict = dict(zip([float(i[1]) for i in data], [j[0] for j in data]))
IndexError: list index out of range
如果能提供一些帮助(甚至是一个网址),我会非常感激,因为我已经搜索过了,但没有找到解决办法。
新用户
1 个回答
4
你应该使用一个叫做 csv.reader
的东西;这是Python里专门用来读取这种文件的内置工具。
>>> import csv
>>> fieldnames = ("pntnums", "xcogo", "ycogo", "zcogo", "bearing",
"rad", "grad", "mval", "HCOD", "VCOD")
>>> reader = csv.DictReader(open(...), delimiter="\t", fieldnames=fieldnames)
然后你可以遍历 reader
里的元素,它会给你字典格式的数据:
>>> import pprint
>>> for row in reader:
... pprint.pprint(row)
...
{None: ['0.00000', 'PBT PBT', 'A001 B001 '],
'HCOD': 'INFINITY',
'VCOD': '0.00034',
'bearing': '0.000',
'grad': '47',
'mval': '39.5',
'pntnums': '1',
'rad': '97',
'xcogo': '303233.479',
'ycogo': '233942.326',
'zcogo': '52.500'}
{None: ['0.00000', 'TS', 'A001'],
'HCOD': 'INFINITY',
'VCOD': '0.00034',
'bearing': '153.975',
'grad': '47',
'mval': '39.5',
'pntnums': '2',
'rad': '97',
'xcogo': '303386.031',
'ycogo': '233921.445',
'zcogo': '52.553'}
{None: ['0.00000', 'SC', 'A002'],
'HCOD': '-300.000',
'VCOD': '0.00034',
'bearing': '165.975',
'grad': '38',
'mval': '54.2',
'pntnums': '3',
'rad': '96',
'xcogo': '303397.931',
'ycogo': '233919.897',
'zcogo': '52.557'}
{None: ['6.25000', 'PC', 'B002'],
'HCOD': '-300.000',
'VCOD': '0.00034',
'bearing': '173.308',
'grad': '14',
'mval': '52.6',
'pntnums': '4',
'rad': '95',
'xcogo': '303405.224',
'ycogo': '233919.137',
'zcogo': '52.559'}
(这里的数据可能和字段不完全匹配,因为我没有原始的制表符分隔文本,只能从StackOverflow上复制粘贴的内容。如果你用原始文件来处理,它就能正常工作了=)。