จะอ่านไฟล์ดองได้อย่างไร?


91

ฉันสร้างข้อมูลบางส่วนและเก็บไว้หลายครั้งดังนี้:

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

ทุกครั้งที่ขนาดของไฟล์เพิ่มขึ้น แต่เมื่อเปิดไฟล์

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

ฉันสามารถดูได้เฉพาะข้อมูลจากครั้งล่าสุด ฉันจะอ่านไฟล์อย่างถูกต้องได้อย่างไร?


1
คุณกำลังต่อท้ายวัตถุในไฟล์ของคุณ เมื่อคุณยกเลิกการเลือกคุณจะยกเลิกการเลือกรายการแรกเท่านั้น แน่ใจหรือว่าต้องการข้อมูลเหล่านั้นทั้งหมด? ถ้าไม่ - เปลี่ยนเป็นopen('filename', 'wb')
Andrey

ใช่ฉันต้องการทุกรายการ ขนาดของไฟล์แสดงให้เห็นว่ามีทั้งหมด
Kenenbek Arzymatov

1
แล้ว @jsbueno ก็ใช่ในคำตอบของเขา
Andrey


ฉันสร้างบางสิ่งเพื่อดูไฟล์ดองโดยตรงในเบราว์เซอร์ของคุณ: pickleviewer.com
Christo S. Christov

คำตอบ:


98

Pickle ทำให้เป็นอนุกรมของวัตถุทีละชิ้นและอ่านกลับวัตถุชิ้นเดียว - ข้อมูลดองจะถูกบันทึกตามลำดับในไฟล์

หากคุณเพียงแค่pickle.loadอ่านวัตถุแรกที่ทำให้เป็นอนุกรมลงในไฟล์ (ไม่ใช่วัตถุสุดท้ายตามที่คุณเขียน)

หลังจากยกเลิกการกำหนดค่าอ็อบเจ็กต์แรกตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของอ็อบเจ็กต์ถัดไป - หากคุณเพียงแค่เรียกpickle.loadอีกครั้งมันจะอ่านอ็อบเจ็กต์ถัดไป - ทำเช่นนั้นจนจบไฟล์

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

27

มีฟังก์ชันread_pickleเป็นส่วนหนึ่งของแพนด้า 0.22+

import pandas as pd

object = pd.read_pickle(r'filepath')

6

ต่อไปนี้เป็นตัวอย่างวิธีการเขียนและอ่านไฟล์ดอง โปรดทราบว่าหากคุณต่อท้ายข้อมูลดองลงในไฟล์คุณจะต้องอ่านต่อจากไฟล์จนกว่าคุณจะพบสิ่งที่คุณต้องการหรือมีการสร้างข้อยกเว้นโดยไปถึงจุดสิ้นสุดของไฟล์ นั่นคือสิ่งที่ฟังก์ชันสุดท้ายทำ

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

ฉันพัฒนาเครื่องมือซอฟต์แวร์ที่เปิด (ส่วนใหญ่) ไฟล์ Pickle โดยตรงในเบราว์เซอร์ของคุณ (ไม่มีการถ่ายโอนข้อมูลจึงเป็นส่วนตัว 100%):

https://pickleviewer.com/


-27

คุณไม่ได้ทำอะไรกับมันคุณกำลังโหลดไฟล์เท่านั้น

for line in x:
    print x

จะพิมพ์แต่ละบรรทัด (ในวินาทีที่มีคำสั่ง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.