2012-06-10 165 views
1

具体内容我有一个数组一个文件test.txt:得到文件蟒蛇

array = [3,5,6,7,9,6,4,3,2,1,3,4,5,6,7,8,5,3,3,44,5,6,6,7] 

现在我想要做的就是数组的内容,并与阵列进行一些计算。但问题是,当我做open("test.txt")它输出内容作为字符串。事实上,这个数组非常大,如果我做一个循环,它可能不是有效的。有没有什么办法让内容不分裂,?任何新想法?

+2

为什么不用数据创建一个.py文件? –

回答

5

您的文本文件需要看起来像Python语法吗?逗号分隔值的列表将是通常的方式提供数据:

1,2,3,4,5 

然后,你可以读取与该csv模块或上述numpy的功能/写。有很多关于如何高效地读取csv数据的文档。一旦你有你的CSV阅读数据对象设置,数据可以存储的东西,如:

data = [ map(float, row) for row in csvreader] 
9

我建议您将文件另存为json,然后使用json模块将其读入。要么,要么将其作为.py文件,并将其作为python导入。看起来像Python分配的.txt文件有点奇怪。

5

如果要在文件中存储类似python的表达式,请仅存储表达式(即没有0​​)并使用ast.literal_eval()解析它。

但是,请考虑使用不同的格式,如JSON。根据计算结果,您可能还需要考虑使用不需要一次将所有数据加载到内存中的格式。

2

是否必须将数组保存为字符串?你可以使用一个pickle文件并将它保存为Python列表吗?

如果不是,你可以尝试懒惰的评价?也许只需要处理数组的部分。

可能地,如果整个阵列上都有计算需要时刻进行,那么预先计算这些结果并将它们存储在txt文件中可能是一个好主意,除了列表或代替列表。

1

你可以编写一个解析器。他们非常简单。比正则表达式快得多,请不要这样做。并不是任何人提出的。

# open up the file (r = read-only, b = binary) 
stream = open("file_full_of_numbers.txt", "rb") 
prefix = '' # end of the last chunk 
full_number_list = [] 

# get a chunk of the file at a time 
while True: 
    # just a small 1k chunk 
    buffer = stream.read(1024) 
    # no more data is left in the file 
    if '' == buffer: 
     break 
    # delemit this chunk of data by a comma 
    split_result = buffer.split(",") 
    # append the end of the last chunk to the first number 
    split_result[0] = prefix + split_result[0] 
    # save the end of the buffer (a partial number perhaps) for the next loop 
    prefix = split_result[-1] 
    # only work with full results, so skip the last one 
    numbers = split_result[0:-1] 
    # do something with the numbers we got (like save it into a full list) 
    full_number_list += numbers 

# now full_number_list contains all the numbers in text format 

当缓冲区为空时,您还必须添加一些逻辑来使用前缀。但是我会将这些代码留给你。

2

您也可以使用numpy使用numpy.genfromtxt或numpy.loadtxt从文件加载数据。两者都非常快,并且都有能力在重载时进行重铸。如果数组已经被加载了,你可以使用numpy将它转换为一个浮点数组,这非常快。

import numpy as np 
a = np.array(["1", "2", "3", "4"]) 
a = a.astype(np.float) 
1

好了,下面的方法是很危险的。因为它们被用于通过向其中注入代码来攻击系统,所以使用它们需要您自担风险。
array = eval(open("test.txt", 'r').read().strip('array = '))
execfile('test.txt') # this is the fastest but most dangerous.

更安全的方法。

import ast 
array = ast.literal_eval(open("test.txt", 'r').read().strip('array = ')). 
    ... 
array = [float(value) for value in open('test.txt', 'r').read().strip('array = [').strip('\n]').split(',')] 

序列化Python对象,所以你可以在以后加载它们的eassiest方法是使用咸菜。假设你不想要一个人类可读的格式,因为这增加了主要的头,不管是明智的,csv是快速的,json是灵活的。

import pickle 
import random 
array = random.sample(range(10**3), 20) 
pickle.dump(array, open('test.obj', 'wb')) 

loaded_array = pickle.load(open('test.obj', 'rb')) 
assert array == loaded_array 

泡菜确实有一些开销,如果你需要序列化大对象可以指定压缩比,默认是0不压缩,您可以将其设置为pickle.HIGHEST_PROTOCOL pickle.dump(array, open('test.obj', 'wb'), pickle.HIGHEST_PROTOCOL)

如果你正在使用大型的数字或科学数据集,然后使用numpy.tofile/numpy.fromfile或scipy.io.savemat/scipy.io.loadmat他们几乎没有开销,但只有当你已经使用numpy/scipy。

祝你好运。

+0

ast.literal_eval()会更好,更安全地使用 –

+0

是的,但在python社区,我们总是假设我们都是自愿的成年人,并且我们知道我们在做什么....对于这种情况很少有这种情况。 –

+0

我删除了-1并添加+1 –