在Python中使用csv文件中的对象

时间:2017-10-04 19:31:42

标签: python csv object populate

我有一个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 ",)

1 个答案:

答案 0 :(得分:2)

我认为您需要一个容器,您可以在其中存储您正在创建的国家/地区。我还会考虑将班级名称大写:

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))