피클 파일을 읽는 방법?


85

몇 가지 데이터를 만들고 다음과 같이 여러 번 저장했습니다.

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

답변:


91

Pickle은 한 번에 단일 개체를 직렬화하고 단일 개체를 다시 읽습니다. 피클 데이터는 파일에 순서대로 기록됩니다.

단순히 그렇게 pickle.load한다면 파일에 직렬화 된 첫 번째 객체를 읽어야합니다 (작성한 마지막 객체가 아님).

첫 번째 객체를 직렬화 해제 한 후 파일 포인터는 다음 객체의 시작 지점에 있습니다. pickle.load다시 호출 하면 다음 객체를 읽습니다. 파일이 끝날 때까지 수행합니다.

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

21

pandas 0.22+의 일부로 read_pickle 함수 가 있습니다.

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()


-25

당신은 그것에 대해 아무것도하지 않고 파일을로드하는 것입니다.

for line in x:
    print x

각 줄을 인쇄합니다. (두 번째 성명서)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.