我有一个文件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")
时,它将内容输出为字符串。实际上阵列非常大,如果我做一个循环,它可能效率不高。有没有办法在不分割,
的情况下获取内容?有什么新想法吗?
答案 0 :(得分:9)
我建议您将文件另存为json,并使用json
模块将其读入。要么是,要么使它成为.py文件,并将其导入为python。一个看起来像python赋值的.txt文件有点奇怪。
答案 1 :(得分:5)
如果要在文件中存储类似python的表达式,只存储 表达式(即没有array =
)并使用ast.literal_eval()
解析它。
但是,请考虑使用其他格式,例如JSON。根据计算结果,您可能还需要考虑使用不需要一次将所有数据加载到内存中的格式。
答案 2 :(得分:5)
你的文本文件是否需要看起来像python语法?逗号分隔值列表将是提供数据的常用方法:
1,2,3,4,5
然后你可以使用csv
模块或上面提到的numpy函数进行读/写。有很多关于如何有效地读取csv数据的文档。设置好csv阅读器数据对象后,可以使用以下内容存储数据:
data = [ map( float, row) for row in csvreader]
答案 3 :(得分:2)
数组必须保存为字符串吗?你可以使用pickle文件并将其保存为Python列表吗?
如果没有,你能尝试懒惰评估吗?也许只根据需要处理数组的部分。
可能的话,如果你必须经常对整个阵列进行计算,那么预先计算这些结果并将它们存储在txt文件中除了列表之外或者代替列表也是一个好主意。
答案 4 :(得分:2)
您还可以使用numpy从numpy.genfromtxt或numpy.loadtxt加载文件中的数据。两者都非常快,都能够在加载时进行重铸。如果已加载数组,则可以使用numpy将其转换为浮点数组,这非常快。
import numpy as np
a = np.array(["1", "2", "3", "4"])
a = a.astype(np.float)
答案 5 :(得分: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
当缓冲区为空时,您还必须添加一些逻辑来使用前缀。但是我会把这些代码留给你。
答案 6 :(得分: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对象以便以后加载它们的最简单方法是使用pickle。假设你不想要一个人类可读的格式,因为这会增加主要的头部,无论如何,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
pickle确实有一些开销,如果你需要序列化大对象你可以指定压缩比,默认为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的。