2013-04-23 22 views
8

Tôi đang chạy chương trình Python sử dụng mô-đun shelve ở trên cùng của pickle. Sau khi chạy chương trình này đôi khi tôi nhận được một tệp đầu ra là a.data nhưng vào những lúc khác, tôi nhận được ba tệp đầu ra là a.data.bak, a.data.dira.data.dat.Tại sao mô-đun gắn trong python đôi khi tạo các tệp có các phần mở rộng khác nhau?

Tại sao lại như vậy?

+0

Có thể chương trình đang thực hiện điều đó. Mô đun [shelve] (http://hg.python.org/cpython/file/e0c0bcd60033/Lib/shelve.py) không làm bất cứ điều gì như thế này. – mata

+3

'" Là một tác dụng phụ, phần mở rộng có thể được thêm vào tên tệp và nhiều hơn một tệp có thể được tạo. "' [(C)] (http://docs.python.org/2/library/shelve. html # shelve.open) Tuy nhiên, điều này không trả lời _why_. –

Trả lời

22

Có khá một số hướng dẫn ở đây. Theo tôi cẩn thận.

Mô-đun shelve được triển khai ở trên cùng của anydbm module. Module này đóng vai trò như một mặt tiền cho 4 triển khai DBM cụ thể khác nhau, và nó sẽ chọn các mô-đun đầu tiên có sẵn khi tạo một cơ sở dữ liệu mới, theo thứ tự sau:

  1. dbhash (bị phản đối nhưng vẫn là anydbm lựa chọn đầu tiên). Đây là proxy cho bsddb module, .open() thực sự là bsddb.hashopen()
  2. gdbm, mô-đun Python cho thư viện GNU DBM, cung cấp nhiều chức năng hơn mô-đun dbm có thể cung cấp khi được sử dụng với cùng loại này.
  3. dbm, mô-đun proxy sử dụng thư viện ndbm, BSD DB và GNU DBM (được chọn khi Python được biên dịch).
  4. dumbdbm, triển khai thuần túy-python.

Đây là phạm vi lựa chọn giúp các tệp shelve xuất hiện để phát triển các tiện ích bổ sung trên các nền tảng khác nhau.

Module dumbdbm là một trong đó bổ sung thêm các .bak, .dat.dir phần mở rộng:

mở một cơ sở dữ liệu dumbdbm và trả về một đối tượng dumbdbm. Đối số tên tệp là tên cơ sở của tệp cơ sở dữ liệu (không có bất kỳ tiện ích mở rộng cụ thể nào). Khi cơ sở dữ liệu dumbdbm được tạo, các tệp có các tiện ích mở rộng .dat.dir được tạo.

Tệp .dir được di chuyển đến .bak khi các chỉ mục mới được cam kết cho các thay đổi được thực hiện cho cấu trúc dữ liệu.

Điều đó có nghĩa là khác ba tùy chọn cho anydbm không khả dụng trên nền tảng của bạn.

Các định dạng khác có thể cung cấp cho bạn các tiện ích mở rộng khác. Mô-đun dbm có thể sử dụng .dir, .pag hoặc .db, tùy thuộc vào thư viện nào được sử dụng cho mô-đun đó.

+0

Cảm ơn bạn đã trả lời. chỉ một điều khác. Bạn có biết làm thế nào tôi có thể buộc chương trình của tôi sử dụng dumbdbm không phải bất kỳ mô-đun khác cho cơ sở dữ liệu? –

+3

Tạo hai tệp rỗng với phần mở rộng '.dir' và' .dat' nếu chúng chưa tồn tại, sau đó 'anydbm' sẽ giả sử đã có cơ sở dữ liệu' dumbdbm' ở đó và sử dụng mô-đun 'dumbdbm'. –

Các vấn đề liên quan