具体内容我有一个数组一个文件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")
它输出内容作为字符串。事实上,这个数组非常大,如果我做一个循环,它可能不是有效的。有没有什么办法让内容不分裂,
?任何新想法?
具体内容我有一个数组一个文件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")
它输出内容作为字符串。事实上,这个数组非常大,如果我做一个循环,它可能不是有效的。有没有什么办法让内容不分裂,
?任何新想法?
您的文本文件需要看起来像Python语法吗?逗号分隔值的列表将是通常的方式提供数据:
1,2,3,4,5
然后,你可以读取与该csv
模块或上述numpy的功能/写。有很多关于如何高效地读取csv数据的文档。一旦你有你的CSV阅读数据对象设置,数据可以存储的东西,如:
data = [ map(float, row) for row in csvreader]
我建议您将文件另存为json,然后使用json
模块将其读入。要么,要么将其作为.py文件,并将其作为python导入。看起来像Python分配的.txt文件有点奇怪。
如果要在文件中存储类似python的表达式,请仅存储表达式(即没有0)并使用ast.literal_eval()
解析它。
但是,请考虑使用不同的格式,如JSON。根据计算结果,您可能还需要考虑使用不需要一次将所有数据加载到内存中的格式。
是否必须将数组保存为字符串?你可以使用一个pickle文件并将它保存为Python列表吗?
如果不是,你可以尝试懒惰的评价?也许只需要处理数组的部分。
可能地,如果整个阵列上都有计算需要时刻进行,那么预先计算这些结果并将它们存储在txt文件中可能是一个好主意,除了列表或代替列表。
你可以编写一个解析器。他们非常简单。比正则表达式快得多,请不要这样做。并不是任何人提出的。
# 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
当缓冲区为空时,您还必须添加一些逻辑来使用前缀。但是我会将这些代码留给你。
您也可以使用numpy使用numpy.genfromtxt或numpy.loadtxt从文件加载数据。两者都非常快,并且都有能力在重载时进行重铸。如果数组已经被加载了,你可以使用numpy将它转换为一个浮点数组,这非常快。
import numpy as np
a = np.array(["1", "2", "3", "4"])
a = a.astype(np.float)
好了,下面的方法是很危险的。因为它们被用于通过向其中注入代码来攻击系统,所以使用它们需要您自担风险。
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。
祝你好运。
ast.literal_eval()会更好,更安全地使用 –
是的,但在python社区,我们总是假设我们都是自愿的成年人,并且我们知道我们在做什么....对于这种情况很少有这种情况。 –
我删除了-1并添加+1 –
为什么不用数据创建一个.py文件? –