Python:读取文件,将行存储为列表并创建行列表

时间:2015-02-18 13:13:39

标签: python

我有一个数据文件,其中包含我导入的一定数量的行和列。我想将每行的值存储在列表中,最后创建一个由每行列表组成的列表,例如:简化版:

输入:

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行的数据文件。

提前致谢!

6 个答案:

答案 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']],

你可以看到我们接近目标,但内部列表的元素不是数字,而是数字的文本重新表达,即字符串。

我们必须引入另一个步骤,即将字符串转换为数字。我们有两个选择,内置intfloat,在你的情况下,你似乎想要整数,所以我们想要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()