带有空格分隔的Python 3文本文件列表

时间:2017-07-12 07:36:07

标签: python python-3.x

使用Python 3,我想从文本文件(hoge.txt)制作列表,如:

a1 b1 c1 d1
a2 b2 c2 d2
a3 b3 c3 d3
....
an bn cn dn

列表应该是:

a = [a1, a2, ...., an]
b = [b1, b2, ...., bn]
c = [c1, c2, ...., cn]
d = [d1, d2, ...., dn]

这是我可以制作的python代码,但有没有办法让它更简单,更好?我想尽可能使用列表理解,这在内存使用方面可能更有效?.....

a=[]
b=[]
c=[]
d=[]
for line in open('hoge.txt'):
    parts=line.split()
    a.append(parts[0])
    b.append(parts[1])
    c.append(parts[2])
    d.append(parts[3])

2 个答案:

答案 0 :(得分:4)

您可以使用csv阅读器(带分隔符' ')来读取文件,然后使用zip(*data)转换数据

from csv import reader

with open('hoge.txt', 'r') as file:
    data = reader(file, delimiter=' ')
    transposed = (list(item) for item in zip(*data))
    # transposed = zip(*data)  # produces tuples: ('a1', 'a2', 'a3', 'an')
                               # instead of lists. depends on your needs.

a, b, c, d = transposed
print(a)  # ['a1', 'a2', 'a3', 'an']

最后一次分配仅适用于文件中的4行。但你应该能够根据自己的需要进行调整。这是一个变种:

a = next(transposed)  # ['a1', 'a2', 'a3', 'an']
b = next(transposed)  # ['b1', 'b2', 'b3', 'bn']
....

如果你想直接使用列表理解来转换(感谢Maarten Fabré的评论):

with open('hoge.txt', 'r') as file:
    data = reader(file, delimiter=' ')
    transposed = [list(item) for item in zip(*data)]
# [['a1', 'a2', 'a3', 'an'], ['b1', 'b2', 'b3', 'bn'], 
#  ['c1', 'c2', 'c3', 'cn'], ['d1', 'd2', 'd3', 'dn']]

您需要转置数据并不容易找到内存效率高的版本。如果你想节省内存,你必须多次迭代文件。

答案 1 :(得分:1)

您可以使用numpy.loadtxt执行任务。

import numpy as np
file_data = np.loadtxt('hoge.txt', usecols=(0,1,2,3))
a = file_data[:,0]
b = file_data[:,1]
c = file_data[:,2]
d = file_data[:,3]