Установите имя списка в классе, используя функцию - PullRequest
1 голос
/ 05 октября 2011

У меня есть класс для импорта данных из файла CSV и функция, которая принимает имя файла и имя для списка вывода. Я хочу установить имя self.data_name равным self.info, используя функцию setattr(). Как я могу это сделать?

import csv

class import_data:

    def import_csv(self, filename_csv, data_name):


            setattr(self,data_name,0)

            datafile = open(filename_csv, 'r')
            datareader = csv.reader(datafile)
            self.data_name = []

            for row in datareader:
                self.data_name.append(row)
            print("finished importing data")

b = import_data()
b.import_csv('info.csv', 'info')
print(b.info)

Это не работает, потому что b.data_name не b.info. Это печатает 0 вместо импортированного файла CSV.

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Попробуйте это:

class import_data:
    def import_csv(self, filename_csv, data_name):
        with open(filename_csv, 'r') as f:
            setattr(self, data_name, list(csv.reader(f)))
        print("finished importing data")
0 голосов
/ 05 октября 2011

Вам придется заменить все использования self.data_name в функции import_csv() вызовами либо setattr(), либо getattr(), чтобы иметь возможность использовать динамическое имя.

Использование self.data_name будет использовать член с именем data_name, как я подозреваю, вы уже поняли, и это не то, что вы хотите сделать.

Например, попробуйте следующее:

class import_data:
    def import_csv(self, filename_csv, data_name):

            #set dynamic named item to default value
            #not required if this will happen anyway (in this example it does)
            setattr(self,data_name,[])  

            #preparation activities
            datafile = open(filename_csv, 'r')
            datareader = csv.reader(datafile)

            #do required work using a temporary local variable
            temp = []
            for row in datareader:
                temp.append(row)

            #copy the temporary local variable into the dynamically named one
            setattr(self, data_name, temp)

            #tidy up activities
            datafile.close()
            print("finished importing data")

Убедитесь, что вы посмотрите на ответ eumiro , в котором используется лучший, более компактный и более питонический подход к вашей конкретной проблеме с использованием with и list().Тем не менее, вышеизложенное должно прояснить, как вы могли бы использовать setattr() в более широком диапазоне случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...