【问题标题】:Python - Dictionary, PicklePython - 字典,泡菜
【发布时间】:2021-04-10 20:59:42
【问题描述】:

我正在学习 Python 课程的介绍,但我的程序无法运行。以下是项目说明:

  • 创建一个名为“Nation”的类,其中包含四个实例变量来保存一个国家/地区的数据,并创建一个名为 popDensity 的方法来计算该国家/地区的人口密度。编写一个程序,使用该类创建一个包含 193 个项目的字典,其中字典的每个项目具有以下形式: 国家名称:该国家的 Nation 对象
    使用文件“UN.txt”创建字典,并将字典保存在名为nationDict.dat 的腌制二进制文件中。

“UN.txt”文件主要包含国家、大陆、人口、地区的列表(例如:Albania,Europe,3.0,11100)

这是我创建的程序(使用 pythonanywhere.com):

import pickle

def main():
    createDictionaryofNations()

def createDictionaryofNations():
    nationdict = {}
    for line in open("UN.txt", 'r'):
        data = line.split(',')
        country = Nation()
        country.setName(data[0])
        country.setContinent(data[1])
        country.setPopulation (float(data[2]))
        country.setArea (float(data[3].rstrip()))
        nationdict[country.getName()] = country

    pickle.dump(nationdict, open("nationdict.dat", 'wb'))
    return nationdict

class Nation:
    def __init__(self):
        self._name = ""
        self._continent = ""
        self._population = 0.0
        self._area = 0

    def setName(self, name):
        self._name = name

    def getName(self):
        return self._name

    def setContinent(self, continent):
        self._continent = continent

    def getContinent(self):
        return self._continent

    def setPopulation(self, population):
        self._population = population

    def getPopulation(self):
        return self._population

    def setArea(self,area):
        self._area = area

    def getArea(self):
        return self._area

    def popDensity(self):
        return self._population / self._area

main()

它会创建 Nationdict.dat 文件,但它只包含这 5 个字符 €}”.

你能告诉我我做错了什么吗?我已经经历了很多次,浏览了大量的文章、帮助网站等,但无法弄清楚我错过了什么。

欣赏!

杰斯

【问题讨论】:

  • 您无法在文本编辑器中正确查看二进制文件。检查磁盘上文件的实际大小。
  • 如果我的回答解决了您的问题,请将其标记为已接受。

标签: python


【解决方案1】:

你没有做错任何事,pickle 生成了一个人类不可读的文件。要检查它是否有效,请运行另一个程序

import pickle
import so # so.py is my name of the file with your code from the question
print(pickle.load(open( "nationdict.dat", "rb")))

【讨论】:

  • 我运行了该程序,它以 {} 的形式返回。我认为它会一无所有地回来。我回头看了看我的 UN.txt 文件,它是空的。我重新加载了该文件并运行了原始程序,现在出现此错误 - _pickle.PicklingError: Can't pickle main.Nation'>: it's not the same object as main.Nation 也许我注定要在这门课上不及格!
  • 你有没有把腌制国家当作数组?
  • 我没有,因为我还没有学会。 :) 你能给我一个进一步的解释吗?我尝试搜索,但得到的东西让我难以理解。
  • 你一定已经学会了。我的意思是酸洗[data[0], data[1], float(data[2]), float(data[3].rstrip())] 作为自定义类不可酸洗。
  • 我还没有或者可能没有充分了解它来理解它。就像我说的,这实际上是我的第一堂课,而且是在线/课本课。我一直在用我能在网上找到但仍在苦苦挣扎的任何东西来补充我的课堂材料。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多