具體內容我有一個數組一個文件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文件? –