Hướng dẫn how to save all variables in python - cách lưu tất cả các biến trong python

Nếu bạn muốn câu trả lời được chấp nhận được trừu tượng hóa để hoạt động, bạn có thể sử dụng:

    import shelve

    def save_workspace(filename, names_of_spaces_to_save, dict_of_values_to_save):
    '''
        filename = location to save workspace.
        names_of_spaces_to_save = use dir() from parent to save all variables in previous scope.
            -dir() = return the list of names in the current local scope
        dict_of_values_to_save = use globals() or locals() to save all variables.
            -globals() = Return a dictionary representing the current global symbol table.
            This is always the dictionary of the current module (inside a function or method,
            this is the module where it is defined, not the module from which it is called).
            -locals() = Update and return a dictionary representing the current local symbol table.
            Free variables are returned by locals() when it is called in function blocks, but not in class blocks.

        Example of globals and dir():
            >>> x = 3 #note variable value and name bellow
            >>> globals()
            {'__builtins__': , '__name__': '__main__', 'x': 3, '__doc__': None, '__package__': None}
            >>> dir()
            ['__builtins__', '__doc__', '__name__', '__package__', 'x']
    '''
    print 'save_workspace'
    print 'C_hat_bests' in names_of_spaces_to_save
    print dict_of_values_to_save
    my_shelf = shelve.open(filename,'n') # 'n' for new
    for key in names_of_spaces_to_save:
        try:
            my_shelf[key] = dict_of_values_to_save[key]
        except TypeError:
            #
            # __builtins__, my_shelf, and imported modules can not be shelved.
            #
            #print('ERROR shelving: {0}'.format(key))
            pass
    my_shelf.close()

    def load_workspace(filename, parent_globals):
        '''
            filename = location to load workspace.
            parent_globals use globals() to load the workspace saved in filename to current scope.
        '''
        my_shelf = shelve.open(filename)
        for key in my_shelf:
            parent_globals[key]=my_shelf[key]
        my_shelf.close()

an example script of using this:
import my_pkg as mp

x = 3

mp.save_workspace('a', dir(), globals())

Để nhận/tải không gian làm việc:

import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me

Nó hoạt động khi tôi chạy nó. Tôi sẽ thừa nhận tôi không hiểu dir()globals() 100% vì vậy tôi không chắc liệu có thể có một số cảnh báo kỳ lạ, nhưng cho đến nay nó có vẻ hoạt động. Nhận xét được hoan nghênh :)


Sau một số nghiên cứu nữa nếu bạn gọi save_workspace như tôi đã đề xuất với Globals và save_workspace nằm trong một chức năng, nó sẽ không hoạt động như mong đợi nếu bạn muốn lưu các veria trong phạm vi địa phương. Cho việc sử dụng

import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
0. Điều này xảy ra bởi vì Globals lấy toàn cầu từ mô -đun nơi hàm được xác định, không phải từ nơi được gọi là dự đoán của tôi.

Python cho datascientist: Cách bán tải từ ngày hôm qua.

Nhiều nghiên cứu sinh-datascientist, nếu tình cờ vượt qua

import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
1 trên đường, có thể bỏ lỡ một tính năng tiện dụng ở đó để tiết kiệm không gian làm việc. Bạn đã thực hiện một số phân tích, có một loạt các kết quả trung gian mà bạn muốn sao lưu tạm thời để sử dụng lại sau này mà không cần chạy lại toàn bộ phân tích từ đầu. Trong
import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
1, nó đơn giản như
import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
3. Làm thế nào chúng ta sẽ làm điều đó trong
import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
4?

Có gì trên bàn?

Chúng ta có gì trong không gian làm việc Python bình thường của mình? Hãy để kiểm tra nhanh với dir().

Hiển thị không gian làm việc hiện tại

Ở đây, chúng tôi đã tìm thấy hai biến

import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
6 mà chúng tôi vừa tạo, ngoài các thuộc tính được tích hợp mặc định khác.

Chúng ta có thể lấy lại các giá trị của các biến đó bằng cách sử dụng globals().

Truy xuất các giá trị của các biến

Bây giờ chúng tôi có thể tự động nhận được tên và giá trị của tất cả các biến trong phiên Python của chúng tôi. Chúng ta có thể dễ dàng sao lưu những người bằng cách sử dụng mô -đun tiêu chuẩn. Chỉ cần là đồ rằng không phải tất cả mọi thứ là dưa chua. Một ví dụ đơn giản có thể là hàm

import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
9.

Không phải mọi thứ đều có thể được ngâm

Danh sách rộng hơn của các đối tượng có thể chọn có thể được tìm thấy ở đây.

Để tránh lỗi khi sao lưu, chúng ta có thể lọc các đối tượng không thể sử dụng

def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
0.

def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
Check nếu đối tượng có thể chọn được

Làm thế nào để sao lưu này?

Đặt tất cả lại với nhau, đây là một số giải pháp đơn giản.

Giải pháp đầu tiên là với mô -đun tiêu chuẩn

def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
1:
def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
1 :

Chúng tôi sẽ liệt kê tất cả các đối tượng trên mạng trong phiên hiện tại bằng dir() và truy xuất các giá trị của chúng bằng globals(). Một từ điển

def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
4 tạm thời được sử dụng để thu thập tất cả các đối tượng và sau đó
import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
8 được sử dụng để tuần tự hóa
def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
4 thành một tệp.

import pickle

bk = {}
for k in dir():
obj = globals()[k]
if is_picklable(obj):
try:
bk.update({k: obj})
except TypeError:
pass

# to save session
with open('./your_bk.pkl', 'wb') as f:
pickle.dump(bk, f)

# to load your session

with open('./your_bk.pkl', 'rb') as f:
bk_restore = pickle.load(f)

Giải pháp thứ hai đi với gói

def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
7:
def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
7 package:

Theo cách tiếp cận tương tự, chúng ta có thể sử dụng mô -đun tiêu chuẩn ____28 để lưu và sau đó khôi phục các đối tượng có thể lấy được trong phiên Python. Như đằng sau hậu trường,

def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
8 sử dụng
import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
8 để tuần tự hóa và giảm giá cấu trúc dữ liệu, logic của chúng tôi sẽ rất giống nhau. Ngoài ra, chỉ các đối tượng có thể lấy được mới có thể được lưu và khôi phục bằng
def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
8.

import shelvebk = shelve.open('./your_bk_shelve.pkl','n')
for k in dir():
try:
bk[k] = globals()[k]
except Exception:
pass
bk.close()
# to restore
bk_restore = shelve.open('./your_bk_shelve.pkl')
for k in bk_restore:
globals()[k] = bk_restore[k]
bk_restore.close()

Sự khác biệt cơ bản giữa phương pháp dựa trên

import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
8 và
def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
8 nằm ở bản chất của đối tượng tạm thời của chúng ta. Trong giải pháp đầu tiên,
def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
4 là một từ điển thực sự chứa một bản sao của tất cả các đối tượng được lưu. Do đó, khi chúng tôi kiểm tra kích thước của đối tượng
def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
4 trong hai giải pháp
def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
4 kích thước sẽ là tổng của tất cả các đối tượng được lưu, và do đó lớn hơn kích thước của mỗi đối tượng.

Kích thước của `bk` là bộ sưu tập của tất cả các đối tượng được lưu, do đó kích thước lớn hơn.

Trong giải pháp thứ hai này,

def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
4 chỉ là một tham chiếu đến
import pickle

bk = {}
for k in dir():
obj = globals()[k]
if is_picklable(obj):
try:
bk.update({k: obj})
except TypeError:
pass

# to save session
with open('./your_bk.pkl', 'wb') as f:
pickle.dump(bk, f)

# to load your session

with open('./your_bk.pkl', 'rb') as f:
bk_restore = pickle.load(f)

9. Thật vậy,
def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
8 đóng vai trò là giao diện cho cơ sở dữ liệu
import shelvebk = shelve.open('./your_bk_shelve.pkl','n')
for k in dir():
try:
bk[k] = globals()[k]
except Exception:
pass
bk.close()
# to restore
bk_restore = shelve.open('./your_bk_shelve.pkl')
for k in bk_restore:
globals()[k] = bk_restore[k]
bk_restore.close()
1 cơ bản. Kích thước của
import shelvebk = shelve.open('./your_bk_shelve.pkl','n')
for k in dir():
try:
bk[k] = globals()[k]
except Exception:
pass
bk.close()
# to restore
bk_restore = shelve.open('./your_bk_shelve.pkl')
for k in bk_restore:
globals()[k] = bk_restore[k]
bk_restore.close()
2in trường hợp này nhỏ hơn nhiều ở sau này.

Kích thước của `bk` với cách tiếp cận` kệ` nhỏ hơn nhiều

Do đó, có ít nhất hai lợi thế trong việc sử dụng

def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
8:

  • Lấy bộ nhớ thấp hơn khi sao lưu phiên hiện tại
  • Có thể tải một phần phiên đã lưu bằng cách mở cơ sở dữ liệu và chỉ tải các biến bắt buộc.

Giải pháp thứ ba là với

import shelvebk = shelve.open('./your_bk_shelve.pkl','n')
for k in dir():
try:
bk[k] = globals()[k]
except Exception:
pass
bk.close()
# to restore
bk_restore = shelve.open('./your_bk_shelve.pkl')
for k in bk_restore:
globals()[k] = bk_restore[k]
bk_restore.close()
4.
import shelvebk = shelve.open('./your_bk_shelve.pkl','n')
for k in dir():
try:
bk[k] = globals()[k]
except Exception:
pass
bk.close()
# to restore
bk_restore = shelve.open('./your_bk_shelve.pkl')
for k in bk_restore:
globals()[k] = bk_restore[k]
bk_restore.close()
4 .

Như đã đề cập ở trên, có những đối tượng mà chúng ta sẽ không thể dồn, ví dụ, chức năng Lambda. Chúng ta có thể sử dụng giải pháp của bên thứ ba với mô -đun

import shelvebk = shelve.open('./your_bk_shelve.pkl','n')
for k in dir():
try:
bk[k] = globals()[k]
except Exception:
pass
bk.close()
# to restore
bk_restore = shelve.open('./your_bk_shelve.pkl')
for k in bk_restore:
globals()[k] = bk_restore[k]
bk_restore.close()
5. Nó cho phép tuần tự hóa nhiều loại đối tượng hơn. Và trong trường hợp thất bại, nó cung cấp các chức năng, ví dụ:
import shelvebk = shelve.open('./your_bk_shelve.pkl','n')
for k in dir():
try:
bk[k] = globals()[k]
except Exception:
pass
bk.close()
# to restore
bk_restore = shelve.open('./your_bk_shelve.pkl')
for k in bk_restore:
globals()[k] = bk_restore[k]
bk_restore.close()
6 để điều tra các thuộc tính thất bại bên trong đối tượng đó.

import dill

dill.dump_session('./your_bk_dill.pkl')
#to restore session:
dill.load_session('./your_bk_dill.pkl')

Chúng tôi có thể xác minh điều này bằng cách kiểm tra tổng số đối tượng được khôi phục từ một phiên đã lưu bằng cách sử dụng

def is_picklable(obj):
try:
pickle.dumps(obj)
except Exception:
return False
return True
8 (hoặc
import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me
8) và
import shelvebk = shelve.open('./your_bk_shelve.pkl','n')
for k in dir():
try:
bk[k] = globals()[k]
except Exception:
pass
bk.close()
# to restore
bk_restore = shelve.open('./your_bk_shelve.pkl')
for k in bk_restore:
globals()[k] = bk_restore[k]
bk_restore.close()
5.

Chỉ có 7 đối tượng được ngâm và do đó được khôi phục bằng cách sử dụng `kệ` (hoặc` dưa chua), có nhiều đối tượng có thể được lưu và do đó được khôi phục bằng cách sử dụng `Dill`.

Đây là một ví dụ đơn giản để hiển thị nguyên tắc. Vui lòng kiểm tra cho chính mình. Mã hoàn chỉnh có thể được tìm thấy trong github của tôi.

Ghi chú cuối cùng

Có hai điều không được thảo luận ở đây nhưng sẽ rất quan trọng để biết:

  • Deserialize sử dụng
    import my_pkg as mp
    
    x=1
    
    mp.load_workspace('a', globals())
    
    print x #print 3 for me
    
    8 có thể là một cạm bẫy nghiêm trọng trong an ninh. Xin cẩn thận để không giải phóng đối tượng ngâm từ nguồn không xác định. Tôi sẽ thảo luận về điều này sâu trong một bài viết khác.
  • import my_pkg as mp
    
    x=1
    
    mp.load_workspace('a', globals())
    
    print x #print 3 for me
    
    8 chỉ tạo tài liệu tham khảo tên cho các chức năng và các lớp và mô -đun mà chúng được đưa ra. Không phải là mã chức năng. Do đó, bạn sẽ cần mô -đun xác định trong đó các chức năng và định nghĩa của lớp có thể giải nén chính xác các đối tượng đã lưu của bạn.Not the function’s code. Thus, you will need the defining module where functions and classes’s definitions are to be able to correctly unpickle your saved objects.

Cảm ơn nhiều vì đã đọc. Nếu bạn có bất kỳ giải pháp hoặc nhận xét thay thế nào cho các cách tiếp cận tốt hơn, vui lòng để lại nhận xét.

References:

[1] Lưu bằng Pickle (bài viết gốc của tôi). [2] Tiết kiệm với thì là hoặc kệ.
[2] Save with dill or shelve.

Bạn có thể lưu các biến Python không?

Pickle là một mô -đun Python giúp dễ dàng tuần tự hóa hoặc lưu các biến và tải chúng khi cần. Không giống như tuần tự hóa JSON, Pickle chuyển đổi đối tượng thành một chuỗi nhị phân. and load them when needed. Unlike JSON serialization, Pickle converts the object into a binary string.

Làm thế nào để bạn lưu trữ các biến trong Python?

Trong một số ngôn ngữ lập trình, bạn phải khai báo một biến trước khi sử dụng chúng hoặc xác định thông tin sẽ được lưu trữ trong đó, ví dụ: một số. Tuy nhiên, trong Python, chúng ta chỉ cần nhập tên của biến của chúng ta, theo sau là một dấu bằng và giá trị để gán cho nó.type the name of our variable, followed by an equals sign and a value to assign to it.

Làm cách nào để lưu một biến trong tệp Python?

Chúng ta có thể sử dụng kết nối trong hàm write () để lưu một biến vào một tệp trong Python.Ở đây, chúng tôi cũng sẽ sử dụng hàm str () hoặc repr () để chuyển đổi biến thành một chuỗi và sau đó lưu trữ nó trong tệp.use concatenation within the write() function to save a variable to a file in Python. Here, we will also use the str() or the repr() function to convert the variable to a string and then store it in the file.

Làm cách nào để lưu một không gian làm việc trong Python?

Khi bạn hài lòng với các thay đổi bạn đã thực hiện đối với không gian làm việc, hãy điều hướng đến Window> Workspace> Saving Workspace.Nhập tên cho không gian làm việc, sau đó bấm OK để bảo tồn không gian làm việc của bạn dưới dạng tệp không gian làm việc (tiện ích mở rộng. HWS).navigate to Window > Workspace > Save Workspace. Enter a name for the workspace, then click OK to preserve your workspace as a workspace file (extension . hws).