programing

절인 개체를 로드할 수 없습니다.

newstyles 2023. 5. 14. 10:26

절인 개체를 로드할 수 없습니다.

제가 겪고 있는 문제는 절인 물건을 적재하려고 할 때입니다.두 가지를 모두 사용해 보았습니다.pickle.loads그리고.pickle.load결과는 다음과 같습니다.

pickle.loads:

유형 오류: 'str'이(가) 버퍼 인터페이스를 지원하지 않습니다.

pickle.load:

TypeError: 파일에 'read' 및 'readline' 특성이 있어야 합니다.

제가 이 과정에서 무엇을 잘못하고 있는지 누가 알려주실 수 있나요?

elif str(parser) == "SwissWithdrawn_Parser":
    # swissprot name changes
    print("Gathering SwissProt update info...")
    cache_hits = 0
    cache_misses = 0
    files = set()

    for f in os.listdir("out/cache/"):
        if os.path.isfile("out/cache/" + f):
            files.add(f)

    for name in sp_lost_names:

        cached = False
        url = (
            "http://www.uniprot.org/uniprot/?query=mnemonic%3a"
            + name
            + "+active%3ayes&format=tab&columns=entry%20name"
        )
        hashed_url = str(hash(url))

        ################### For Testing Only - use cache ##################
        if hashed_url in files:
            cached = True
            cache_hits += 1
            content = pickle.loads("out/cache/" + hashed_url)  # <-- problematic line
        else:
            cache_misses += 1
            content = urllib.request.urlopen(url)

        # get the contents returned from the HTTPResponse object
        content_list = [x.decode().strip() for x in content.readlines()]
        if not cached:
            with open("out/cache/" + hashed_url, "wb") as fp:
                pickle.dump(content_list, fp)
        ####################################################################

        # no replacement
        if len(content_list) is 0:
            change_log["swiss-names"] = {name: "withdrawn"}
        # get the new name
        else:
            new_name = content_list[1]
            change_log["swiss-names"] = {name: new_name}

먼저 파일을 읽어야 합니다(바이너리로).bytes) 및 사용pickle.loads()또는 열려 있는 파일 개체를 에 전달합니다.pickle.load()지휘권후자가 더 좋습니다.

with open('out/cache/' +hashed_url, 'rb') as pickle_file:
    content = pickle.load(pickle_file)

두 방법 모두 파일 이름에서 피클을 로드할 수 없습니다.

python2에서 3으로 포팅하다가 이 오류가 발생하면 python2와 3은 바이트를 다르게 처리하므로 'b' 옵션으로 파일 핸들을 열어야 합니다.예를 들어 python2의 경우open(file, 'r') as f: my_list = pickle.load(f)작동하지만 python3에서는 작동하지 않습니다.대신에 당신은 시작해야 합니다.open(file, 'rb') as f: my_list = pickle.load(f)

언급URL : https://stackoverflow.com/questions/18261898/cannot-load-pickled-object