使用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])
答案 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]