Làm thế nào để đọc tệp dưa chua?


85

Tôi đã tạo một số dữ liệu và lưu trữ nó nhiều lần như thế này:

with open('filename', 'a') as f:
        pickle.dump(data, f)

Mỗi khi kích thước của tệp tăng lên, nhưng khi tôi mở tệp

with open('filename', 'rb') as f:
    x = pickle.load(f)

Tôi chỉ có thể xem dữ liệu từ lần cuối cùng. Làm thế nào tôi có thể đọc chính xác tệp?


1
Bạn đang thêm các đối tượng vào tệp của mình. Khi bạn bỏ chọn, bạn chỉ bỏ chọn mục nhập đầu tiên. Bạn có chắc bạn cần tất cả các mục đó? Nếu không - thay đổiopen('filename', 'wb')
Andrey

Có, tôi cần tất cả các mục. Kích thước của các tệp cho thấy rằng nó chứa tất cả.
Kenenbek Arzymatov

1
Sau đó, @jsbueno là đúng trong câu trả lời của mình.
Andrey


Tôi đã tạo một cái gì đó để xem các tệp dưa chua trực tiếp trong trình duyệt của bạn: pickleviewer.com
Christo S. Christov

Câu trả lời:


91

Pickle tuần tự hóa một đối tượng tại một thời điểm và đọc ngược lại một đối tượng - dữ liệu đã chọn được ghi theo trình tự trên tệp.

Nếu bạn chỉ đơn giản làm vậy, pickle.loadbạn nên đọc đối tượng đầu tiên được tuần tự hóa vào tệp (không phải đối tượng cuối cùng như bạn đã viết).

Sau khi hủy số liệu hóa đối tượng đầu tiên, con trỏ tệp sẽ đến đối tượng tiếp theo - nếu bạn chỉ đơn giản gọi pickle.loadlại, nó sẽ đọc đối tượng tiếp theo đó - hãy làm điều đó cho đến khi kết thúc tệp.

objects = []
with (open("myfile", "rb")) as openfile:
    while True:
        try:
            objects.append(pickle.load(openfile))
        except EOFError:
            break

21

Có một hàm read_pickle như một phần của gấu trúc 0.22+

import pandas as pd

object = pd.read_pickle(r'filepath')

6

Sau đây là một ví dụ về cách bạn có thể viết và đọc một tệp pickle. Lưu ý rằng nếu bạn tiếp tục thêm dữ liệu kén chọn vào tệp, bạn sẽ cần phải tiếp tục đọc từ tệp cho đến khi bạn tìm thấy những gì bạn muốn hoặc một ngoại lệ được tạo ra khi đến cuối tệp. Đó là những gì chức năng cuối cùng làm.

import os
import pickle


PICKLE_FILE = 'pickle.dat'


def main():
    # append data to the pickle file
    add_to_pickle(PICKLE_FILE, 123)
    add_to_pickle(PICKLE_FILE, 'Hello')
    add_to_pickle(PICKLE_FILE, None)
    add_to_pickle(PICKLE_FILE, b'World')
    add_to_pickle(PICKLE_FILE, 456.789)
    # load & show all stored objects
    for item in read_from_pickle(PICKLE_FILE):
        print(repr(item))
    os.remove(PICKLE_FILE)


def add_to_pickle(path, item):
    with open(path, 'ab') as file:
        pickle.dump(item, file, pickle.HIGHEST_PROTOCOL)


def read_from_pickle(path):
    with open(path, 'rb') as file:
        try:
            while True:
                yield pickle.load(file)
        except EOFError:
            pass


if __name__ == '__main__':
    main()

6

Tôi đã phát triển một công cụ phần mềm có thể mở (hầu hết) các tệp Pickle trực tiếp trong trình duyệt của bạn (không có gì được chuyển nên nó hoàn toàn riêng tư):

https://pickleviewer.com/


-25

Bạn không làm gì với nó, bạn chỉ đang tải tệp.

for line in x:
    print x

sẽ in từng dòng. (Trong câu thứ hai với tuyên bố)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.