Hướng dẫn pickle zip file in python - tệp zip dưa chua trong python

Đó là do sự không hoàn hảo trong đối tượng giả được thực hiện bởi mô -đun zipfile (đối với phương pháp .open của lớp ZipFile được giới thiệu trong Python 2.6). Xem xét:

>>> f = zf.open('data.pkl')
>>> f.read(1)
'('
>>> f.readline()
'dp1\n'
>>> f.read(1)
''
>>> 

Trình tự của .read(1)-.readline() là những gì .loads trong nội bộ (trên Pickle Protucol-0, mặc định trong Python 2, đó là những gì bạn đang sử dụng ở đây). Thật không may, sự không hoàn hảo của ____ 4 có nghĩa là trình tự cụ thể này không hoạt động, tạo ra một "kết thúc tệp" giả (.read trả về một chuỗi trống) ngay sau cặp đọc/đọc đầu tiên.

Không chắc chắn nếu lỗi này trong thư viện tiêu chuẩn của Python được sửa trong Python 2.7 - Tôi sẽ kiểm tra.

EDIT: vừa được kiểm tra - lỗi được cố định trong Python 2.7 RC1 (ứng cử viên phát hành hiện là phiên bản 2.7 mới nhất). Tôi chưa biết liệu nó có được sửa trong bản phát hành sửa lỗi mới nhất là 2.6 hay không.: just checked -- the bug is fixed in Python 2.7 rc1 (the release candidate that's currently the latest 2.7 version). I don't yet know whether it's fixed in the latest bug-fix release of 2.6 as well.

Chỉnh sửa một lần nữa: Lỗi vẫn còn trong Python 2.6.5, bản phát hành lỗi lỗi mới nhất của Python 2.6-vì vậy nếu bạn không thể nâng cấp lên 2.7 và cần các đối tượng giả hành tốt hơn từ

>>> zf = zipfile.ZipFile('zipped_pickle.zip', 'w', zipfile.ZIP_DEFLATED)
>>> zf.writestr('data.pkl', cPickle.dumps(some_data, -1))
>>> sd2 = cPickle.load(zf.open('data.pkl'))
>>> 
1, một bản sửa lỗi của bản sửa lỗi 2.7 Có vẻ như giải pháp khả thi duy nhất.: the bug is still there in Python 2.6.5, the latest bug-fix release of Python 2.6 -- so if you can't upgrade to 2.7 and need better-behaving pseudofile objects from
>>> zf = zipfile.ZipFile('zipped_pickle.zip', 'w', zipfile.ZIP_DEFLATED)
>>> zf.writestr('data.pkl', cPickle.dumps(some_data, -1))
>>> sd2 = cPickle.load(zf.open('data.pkl'))
>>> 
1, a backport of the 2.7 fix seems the only viable solution.

Lưu ý rằng không chắc chắn bạn cần các đối tượng giả hành tốt hơn; Nếu bạn kiểm soát các cuộc gọi kết xuất và có thể sử dụng giao thức mới nhất và lớn nhất, mọi thứ sẽ ổn:

>>> zf = zipfile.ZipFile('zipped_pickle.zip', 'w', zipfile.ZIP_DEFLATED)
>>> zf.writestr('data.pkl', cPickle.dumps(some_data, -1))
>>> sd2 = cPickle.load(zf.open('data.pkl'))
>>> 

Nó chỉ là "giao thức 0" tương thích ngược CRUFTY (mặc định) yêu cầu hành vi đối tượng giả thích hợp khi trộn các cuộc gọi đọc và đọc trong

>>> zf = zipfile.ZipFile('zipped_pickle.zip', 'w', zipfile.ZIP_DEFLATED)
>>> zf.writestr('data.pkl', cPickle.dumps(some_data, -1))
>>> sd2 = cPickle.load(zf.open('data.pkl'))
>>> 
2 (giao thức 0 cũng chậm hơn và dẫn đến dưa chua lớn hơn, vì vậy nó không được khuyến nghị trừ khi ngược lại Khả năng tương thích với các phiên bản Python cũ hoặc bản chất ASCII-chỉ của dưa chua mà 0 tạo ra, là những ràng buộc bắt buộc trong ứng dụng của bạn).

Mô -đun này tiết kiệm và tải lại các biểu diễn nén của các đối tượng Python chung đến và từ đĩa.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

"""Generic object pickler and compressor

This module saves and reloads compressed representations of generic Python
objects to and from the disk.
"""

__author__ = "Bill McNeill <>"
__version__ = "1.0"

import pickle
import gzip


def save(object, filename, bin = 1):
	"""Saves a compressed object to disk
	"""
	file = gzip.GzipFile(filename, 'wb')
	file.write(pickle.dumps(object, bin))
	file.close()


def load(filename):
	"""Loads a compressed object from disk
	"""
	file = gzip.GzipFile(filename, 'rb')
	buffer = ""
	while 1:
		data = file.read()
		if data == "":
			break
		buffer += data
	object = pickle.loads(buffer)
	file.close()
	return object


if __name__ == "__main__":
	import sys
	import os.path
	
	class Object:
		x = 7
		y = "This is an object."
	
	filename = sys.argv[1]
	if os.path.isfile(filename):
		o = load(filename)
		print "Loaded %s" % o
	else:
		o = Object()
		save(o, filename)
		print "Saved %s" % o

Bạn có thể zip một tệp dưa chua không?

Nếu bạn cần các đặc điểm kích thước tối ưu, bạn có thể nén dữ liệu ngâm một cách hiệu quả.

Làm thế nào để bạn chọn một tập tin trong Python?

Dưa chua trong Python - những điều cơ bản..
Để lưu một dưa chua, sử dụng dưa chua.bãi rác ..
Một quy ước là đặt tên cho các tệp pickle *.Pickle, nhưng bạn có thể đặt tên cho nó bất cứ thứ gì bạn muốn ..
Tải tệp ngâm từ ổ cứng của bạn cũng đơn giản như dưa chua.Tải và chỉ định đường dẫn tệp:.
Lưu DataFrame vào tệp Pickle có tên My_DF ..

Làm cách nào để tạo một tệp zip trong Python?

với zipfile (file_name, 'r') dưới dạng zip: ở đây, một đối tượng zipfile được tạo bằng cách gọi Trình xây dựng zipfile chấp nhận tên tệp và tham số chế độ.Chúng tôi tạo một đối tượng zipfile ở chế độ đọc và đặt tên nó là zip.ZipFile(file_name, 'r') as zip: Here, a ZipFile object is made by calling ZipFile constructor which accepts zip file name and mode parameters. We create a ZipFile object in READ mode and name it as zip.

Python Pickle có nén dữ liệu không?

Các tệp Pickled là đặc trưng cho phiên bản Python-bạn có thể gặp sự cố khi lưu các tệp trong một phiên bản Python và đọc chúng trong bản khác.Cố gắng làm việc trong các phiên bản Python giống hệt nhau, nếu có thể.Pickling không nén dữ liệu - Pickling một đối tượng sẽ không nén nó.Pickling doesn't compress data — Pickling an object won't compress it.