我有一个数据文件,其中包含我导入的一定数量的行和列。我想将每行的值存储在列表中,最后创建一个由每行列表组成的列表,例如:简化版:
输入:
1 2 3
4 5 6
7 8 9
结果我想要
[[1,2,3],[4,5,6],[7,8,9]]
我的代码atm:
result = []
col1 = []
for line in lines[1:]:
# split the line into fields based on white space
fields = line.split()
# convert the text to numbers, make list of values in row k
while k < real:
col = float(fields[k])
col1.append(col)
k+=1
else:
result.append(col1) #make list of lists of values in rows
k=0 #Reset k for other loop using k
del col1[:] #Delete temp list
print result
由于某些原因,在del col1 [:]之后,结果也会被清空。知道为什么会这样吗?
欢迎任何有关如何以更简化的方式执行此操作的建议!你可能已经注意到了,我对python并不熟悉。
请注意,在我的实际案例中,我有一个包含100列和108k行的数据文件。
提前致谢!
答案 0 :(得分:2)
您可以使用csv模块。
import csv
with open('file') as f:
reader = csv.reader(f, delimiter=" ")
print([i for i in reader])
输出:
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
答案 1 :(得分:2)
使用Python 2.x就像
一样简单list_of_lists = [map(int,l.split()) for l in open('data.txt').readlines()]
但是对于Python 3.x,map
builtin返回一个生成器,而不是一个列表,因此必须使用列表推导(LC)来编写
lol = [[int(s) for s in l.split()] for l in open('data.txt').readlines()]
顺便说一句,第二种可能性在Python 2.x中也有效,因此从兼容性POV开始,它可能是首选方法。
让我们关注第二个答案,我们的列表列表(LOL)是使用嵌套列表理解构建的,外部产生由内部列表生成的对象列表,即列表,因此请求LOL ...
基本概念是你不需要在文件的行上显式循环,因为从open
内置函数返回的每个文件对象都有一个返回行列表的.readlines
方法,每一行由换行符所终止的字符串表示。
此列表的元素(行)可以使用.split
字符串方法在单个元素中拆分---默认情况下split
作用于空格,因此它符合您的要求,我们可以使用LC写入
[l.split() for l in open('data.txt').readlines()]
获得以下LOL
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']],
你可以看到我们接近目标,但内部列表的元素不是数字,而是数字的文本重新表达,即字符串。
我们必须引入另一个步骤,即将字符串转换为数字。我们有两个选择,内置int
和float
,在你的情况下,你似乎想要整数,所以我们想要int
,一个接受单个参数的函数(不是完全 true)数字或字符串。
如果我们向int
传递l.split()
的结果,则会引发错误,因为l.split()
不返回字符串而是返回字符串列表...我们必须1 。解压缩列表中的元素,然后将结果打包成一个列表,换句话说,它又是一个LC!
[int(s) for s in l.split()] # -> [1, 2, 3] for the first line, etc
让我们把各个部分放在一起,你有答案:
lol = [[int(s) for s in l.split()] for l in open('data.txt').readlines()]
这很容易(如果你已经知道我试图解释的所有内容,那就是......)
答案 2 :(得分:1)
易:
with open("/tmp/f") as f:
m = [row.split() for row in f.read().split("\n") if row]
print(m)
输出:
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
答案 3 :(得分:0)
with open("data.txt") as inf:
# skip header row
next(inf, "")
# parse data
result = [[float(f) for f in line.split()] for line in inf]
结果
[[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]]
答案 4 :(得分:0)
添加类型转换。
>>> file_path = '/home/Desktop/123.csv'
>>> import csv
>>> with open(file_path) as fp:
... reader = csv.reader(fp, delimiter=" ")
... tmp = [i for i in reader]
... result = []
... for i in tmp:
... result.append([int(j) for j in i])
...
>>> print result
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>>
答案 5 :(得分:0)
file_list = []
f = open(file.txt, 'r')
for line in f.xreadlines():
file_list.append([line])
f.close()