Python 读取文本文件

18 投票
5 回答
72425 浏览
提问于 2025-04-17 02:41

我有一个文本文件,我需要把每一列的数据提取出来,最好是放到字典或者列表里,文件的格式是:

N       ID   REMAIN        VERS          
2 2343333   bana           twelve    
3 3549287   moredp       twelve        
3 9383737   hinsila           twelve           
3 8272655   hinsila           eight        

我尝试过:

crs = open("file.txt", "r")
for columns in ( raw.strip().split() for raw in crs ):  
    print columns[0]

结果是 '超出索引错误'

我还尝试过:

crs = csv.reader(open(file.txt", "r"), delimiter=',', quotechar='|', skipinitialspace=True)
    for row in crs:
                   for columns in row:
                             print columns[3]

但这似乎把每个字符当成一列,而不是每个 '单词'

我想要提取出四列,也就是:

2
2343333
bana
twelve

放到不同的字典或者列表里

任何帮助都非常感谢!

5 个回答

1

这个怎么样?

f = open("file.txt")

for i in f:
    k = i.split()
    for j in k:
        print j
7
>>> with open("file.txt") as f:
...    c = csv.reader(f, delimiter=' ', skipinitialspace=True)
...    for line in c:
...        print(line)
... 
['N', 'ID', 'REMAIN', 'VERS', ''] #that '' is for leading space after columns.
['2', '2343333', 'bana', 'twelve', '']
['3', '3549287', 'moredp', 'twelve', '']
['3', '9383737', 'hinsila', 'twelve', '']
['3', '8272655', 'hinsila', 'eight', '']

或者,老派的做法:

>>> with open("file.txt") as f:
...     [line.split() for line in f]
...
[['N', 'ID', 'REMAIN', 'VERS'],
 ['2', '2343333', 'bana', 'twelve'],
 ['3', '3549287', 'moredp', 'twelve'],
 ['3', '9383737', 'hinsila', 'twelve'],
 ['3', '8272655', 'hinsila', 'eight']]

还有获取列值的方法:

>>> l
[['N', 'ID', 'REMAIN', 'VERS'],
 ['2', '2343333', 'bana', 'twelve'],
 ['3', '3549287', 'moredp', 'twelve'],
 ['3', '9383737', 'hinsila', 'twelve'],
 ['3', '8272655', 'hinsila', 'eight']]
>>> {l[0][i]: [line[i] for line in l[1:]]  for i in range(len(l[0]))}
{'ID': ['2343333', '3549287', '9383737', '8272655'],
 'N': ['2', '3', '3', '3'],
 'REMAIN': ['bana', 'moredp', 'hinsila', 'hinsila'],
 'VERS': ['twelve', 'twelve', 'twelve', 'eight']}
19

这对我来说很好用:

>>> crs = open("file.txt", "r")
>>> for columns in ( raw.strip().split() for raw in crs ):  
...     print columns[0]
... 
N
2
3
3
3

如果你想把列转换成行,可以使用 zip

>>> crs = open("file.txt", "r")
>>> rows = (row.strip().split() for row in crs)
>>> zip(*rows)
[('N', '2', '3', '3', '3'), 
 ('ID', '2343333', '3549287', '9383737', '8272655'), 
 ('REMAIN', 'bana', 'moredp', 'hinsila', 'hinsila'), 
 ('VERS', 'twelve', 'twelve', 'twelve', 'eight')]

如果你的数据中有空行,记得在使用 zip 之前先把它们过滤掉。

>>> crs = open("file.txt", "r")
>>> rows = (row.strip().split() for row in crs)
>>> zip(*(row for row in rows if row))
[('N', '2', '3', '3', '3'), ('ID', '2343333', '3549287', '9383737', '8272655'), ('REMAIN', 'bana', 'moredp', 'hinsila', 'hinsila'), ('VERS', 'twelve', 'twelve', 'twelve', 'eight')]

撰写回答