首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EOFError:输入不足

EOFError:输入不足
EN

Stack Overflow用户
提问于 2017-02-20 23:19:14
回答 2查看 11.4K关注 0票数 1

当我运行下面的代码时,我得到这个错误消息"EOFError: run out of input“这是什么意思??如何纠正它??以及如何在屏幕上输出记录的详细信息。

代码语言:javascript
复制
import pickle # this library is required to create binary files
class CarRecord:
    def __init__(self):
      self.VehicleID = " "          
      self.Registration = " "
      self.DateOfRegistration = " "
      self.EngineSize = 0           
      self.PurchasePrice = 0.00

ThisCar = CarRecord()
Car = [ThisCar for i in range(2)] # list of 2 car records

Car[0].VehicleID = "CD333"
Car[0].Registration = "17888"
Car[0].DateOfRegistration = "18/2/2017"
Car[0].EngineSize = 2500
Car[0].PurchasePrice = 22000.00

Car[1].VehicleID = "AB123"
Car[1].Registration = "16988"
Car[1].DateOfRegistration = "19/2/2017"
Car[1].EngineSize = 2500
Car[1].PurchasePrice = 20000.00

CarFile = open ('Cars.TXT', 'wb' ) # open file for binary write
for j in range (2): # loop for each array element
    pickle.dump (Car[j], CarFile) # write a whole record to the binary file
CarFile.close() # close file

CarFile = open ('Cars.TXT','rb') # open file for binary read
Car = [] # start with empty list
while True: #check for end of file
    Car.append(pickle.load(CarFile)) # append record from file to end of list
CarFile.close()
EN

回答 2

Stack Overflow用户

发布于 2020-08-18 03:00:23

简短回答:最简单的解决方案是使用pickle.dump()将完整的列表写入文件。没有必要在循环中一个接一个地编写所有对象。Pickle就是为你而设计的。

示例代码和替代解决方案:

下面是一个完整的工作示例。一些注意事项:

  • 我更新了你的__init__函数,使初始化代码变得更简单,更短,
  • ,我还增加了一个__repr__函数。这可以用来将记录详细信息打印到屏幕上,这也是您所要求的。(请注意,您也可以实现Python函数,但是我选择了实现__repr__,因为这个Python代码示例使用标准的Python编码样式,(PEP-8).
  • This代码使用上下文管理器打开文件。这样更安全,而且不需要手动关闭文件。

如果您真的想手动编写对象,无论出于什么原因,都有一些安全的替代方法。在此代码示例之后,我将对它们进行解释:

代码语言:javascript
复制
import pickle


class CarRecord:

    def __init__(self, vehicle_id, registration, registration_date, engine_size, purchase_price):
        self.vehicle_id = vehicle_id
        self.registration = registration
        self.registration_date = registration_date
        self.engine_size = engine_size
        self.purchase_price = purchase_price

    def __repr__(self):
        return "CarRecord(%r, %r, %r, %r, %r)" % (self.vehicle_id, self.registration,
                                                  self.registration_date, self.engine_size,
                                                  self.purchase_price)


def main():
    cars = [
        CarRecord("CD333", "17888", "18/2/2017", 2500, 22000.00),
        CarRecord("AB123", "16988", "19/2/2017", 2500, 20000.00),
    ]

    # Write cars to file.
    with open('Cars.TXT', 'wb') as car_file:
        pickle.dump(cars, car_file)

    # Read cars from file.
    with open('Cars.TXT', 'rb') as car_file:
        cars = pickle.load(car_file)

    # Print cars.
    for car in cars:
        print(car)


if __name__ == '__main__':
    main()

输出:

代码语言:javascript
复制
CarRecord('CD333', '17888', '18/2/2017', 2500, 22000.0)
CarRecord('AB123', '16988', '19/2/2017', 2500, 20000.0)

你也可以在一个循环中,而不是一次转储列表。以下代码片段是“将汽车写入文件”和“从文件读取汽车”的替代实现。

备选方案1:将多个对象写入文件

在文件的开头,写下汽车的数量。这可以用来从文件中读取相同数量的汽车。

代码语言:javascript
复制
    # Write cars to file.
    with open('Cars.TXT', 'wb') as car_file:
        pickle.dump(len(cars), car_file)
        for car in cars:
            pickle.dump(car, car_file)

    # Read cars from file.
    with open('Cars.TXT', 'rb') as car_file:
        num_cars = pickle.load(car_file)
        cars = [pickle.load(car_file) for _ in range(num_cars)]

备选方案2:使用"end“标记

在文件的末尾,写入一些可识别的值,例如None。在读取时,这个对象可以用来检测文件的结尾。

代码语言:javascript
复制
    # Write cars to file.
    with open('Cars.TXT', 'wb') as car_file:
        for car in cars:
            pickle.dump(car, car_file)
        pickle.dump(None, car_file)

    # Read cars from file.
    with open('Cars.TXT', 'rb') as car_file:
        cars = []
        while True:
            car = pickle.load(car_file)
            if car is None:
                break
            cars.append(car)
票数 5
EN

Stack Overflow用户

发布于 2017-02-20 23:29:20

您可以将您的while循环更改为:

当接收到EOFError时,这将在输入末尾退出while循环

代码语言:javascript
复制
while True: #check for end of file
    try:
        Car.append(pickle.load(CarFile)) # append record from file to end of list
    except EOFError:
        break
CarFile.close()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42348213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档