2012-06-10 119 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 –