Python将制表符文本文件读取为多个列表

0 投票
1 回答
1487 浏览
提问于 2025-04-16 06:55

你好,作为一个刚接触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上复制粘贴的内容。如果你用原始文件来处理,它就能正常工作了=)。

撰写回答