从文件python中获取特定内容

时间:2012-06-10 00:31:11

标签: python arrays

我有一个文件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")时,它将内容输出为字符串。实际上阵列非常大,如果我做一个循环,它可能效率不高。有没有办法在不分割,的情况下获取内容?有什么新想法吗?

7 个答案:

答案 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的。

祝你好运。