【问题标题】:Error loading pickled file加载腌制文件时出错
【发布时间】:2016-11-09 09:09:43
【问题描述】:

我在 python3 中加载腌制文件时遇到问题。见以下代码:

#!/usr/bin/env python3

import csv,operator
import pickle
import os.path

pathToBin = "foo/bar/foobar.bin"
pathToCSV = "foo/bar/foobar.csv" 

if os.path.isfile(pathToBin):
        print("Binary file already on harddrive, loading from there")
        transactions = pickle.loads( open( pathToBin, "rb" ))
else:
        csvIn = open(pathToCSV,'r')
        reader = csv.reader(csvIn)
        header = next(reader)
        header = header[0].split(";")

        print("Reading file")
        transactions = []
        for row in reader:
                # read file. 
        # transactions contains now lists of strings: transactions = [ ["a","b","c"], ["a2","b2","c3"], ...]
        print("Dumping python file to harddrive")
        myPickleFile = open(pathToBin,'wb')
        pickle.dump(transactions, myPickleFile, protocol=pickle.HIGHEST_PROTOCOL)

# do some more computation

保存文件没有任何问题。但是,加载它会给我以下错误:

transactions = pickle.loads( open( pathToBin, "rb" ))
TypeError: '_io.BufferedReader' does not support the buffer interface

由于我使用的是 python3,因此对字符串的处理方式不同。因此,我专门为保存/加载提供了“b”选项。有人知道为什么这不起作用吗?

【问题讨论】:

    标签: python-3.x pickle


    【解决方案1】:

    你想使用load:

    transactions = pickle.load(open( pathToBin, "rb" ))
    

    从您打开的文件句柄中读取。 loads 接受 bytes 不是文件句柄(意思是:加载“字符串”,现在在 python 3 升级后加载“字节”处理字符串/字节):

    transactions = pickle.loads(open( pathToBin, "rb" ).read())
    

    从文件返回的字节中读取。

    在这种情况下,我会为您推荐第一个选项。第二种选择适用于更复杂的情况。

    另外:最好使用with 上下文来控制文件何时关闭

    with open( pathToBin,"rb") as f:
        transactions = pickle.load(f)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 2017-03-01
      • 2017-03-10
      • 2021-01-13
      • 2018-08-03
      • 2015-12-05
      相关资源
      最近更新 更多