【问题标题】:Poblate objects from csv file in Python在 Python 中从 csv 文件中填充对象
【发布时间】:2018-03-16 07:32:35
【问题描述】:

我有一个 csv 文件 paises.csv,如下所示:

Chile;17000000;0.72;FALSE;0
Hanslandia;2000000;0.2;FALSE;91
Bastiland;4000000;0;TRUE;0

第一列是country 名称,以下是它的一些特征,例如它的人口。因此,我创建了一个 country 类并尝试创建国家并使用 csv 文件中的特征填充它:

# -*- coding: utf-8 -*-
##Importing libraries
import csv
##Defining classes
class country:
    def __init__(self,inhabitants,tolerance,underground,infected_perc):
        self.inhabitants = inhabitants
        self.tolerance = tolerance
        self.underground = underground
        self.infected_perc = infected_perc

with open('paises.csv', 'r') as f:
    reader = csv.reader(f, delimiter = ";")
    for row in reader:
        row[0]=country(row[1],row[2],row[3],row[4]) 

代码运行。但是,它甚至没有创建国家。当我尝试查看row 时,我得到的是:

AttributeError("Can't get attribute 'country' on ",)

【问题讨论】:

  • 您打算将数据存储在哪里?
  • 好吧,在“国家”类的对象中。第一行是名称,下面是它的特征
  • 您需要一个容器(列表、字典、集合)来存储您的国家/地区。否则,您似乎缺少一些类的概念。
  • row[0]=country(row[1],row[2],row[3],row[4]) 创建一个country 实例,将其复制到rows 的第一个槽,覆盖国家名称。然后当您阅读下一行时它会被丢弃。我不认为你想那样做。正如 lmiuelvargasf 所说,您应该将这些内容保存到某个容器中,例如字典,其中 row[0] 作为键,country 实例作为值。
  • 嘿!我刚刚创建了一个字典,其键是国名,值是对象。但是,我无法得到它们。当我尝试获取字典 [国家] 时,我得到同样的错误:AttributeError("Can't get attribute 'country' on ",)

标签: python csv object populate


【解决方案1】:

我认为您需要一个容器来存储您正在创建的国家/地区。我还会考虑将类名大写:

import csv

class Country:
    def __init__(self,inhabitants,tolerance,underground,infected_perc):
        self.inhabitants = inhabitants
        self.tolerance = tolerance
        self.underground = underground
        self.infected_perc = infected_perc

countries = {}
with open('paises.csv', 'r') as f:
   reader = csv.reader(f, delimiter = ";")
   for row in reader:
       countries[row[0]] = Country(row[1], row[2], row[3], row[4])

您想要的国家/地区存储在字典countries 中,您可以使用其名称作为键来访问它们。例如,要访问智利,您可以使用countries['Chile']

更新:

如果您想使用列表而不是字典,您应该在您的类中添加一个字段来存储国家/地区名称:

import csv

class Country:
    def __init__(self,name, inhabitants,tolerance,underground,infected_perc):
        self.name =  name
        self.inhabitants = inhabitants
        self.tolerance = tolerance
        self.underground = underground
        self.infected_perc = infected_perc

countries = []
with open('paises.csv', 'r') as f:
   reader = csv.reader(f, delimiter = ";")
   for row in reader:
       countries.append(Country(row[0], row[1], row[2], row[3], row[4]))

如果使用列表作为容器,您可以将countries.append(Country(row[0], row[1], row[2], row[3], row[4])) 替换为countries.append(Country(*row))

【讨论】:

  • 非常感谢!但是我有两个问题:在 Spyder 中,我看不到字典,因为我得到 "AttributeError("Can't get attribute 'Country' on ",)
  • 另一件事是我应该能够将国家作为对象访问,而不是作为字典键......我该如何改变它?提前致谢!我真的被这个困住了。
  • @idmdvan,使用列表查看我的答案,我认为这更适合您的情况。
  • @idmdvan,如果您发现我的回答有用,请验证它。
  • 完美!我有一个问题......如果我想访问我的国家的人口,使用这个列表方法,我必须做国家[index].population。您对如何像 country.population 一样访问它有什么想法,比如作为对象本身,而不是列表索引?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多