开发者

Set a list name in a class, using a function

I have a class to import data from a CSV file, and a function that takes the filename and a name for the output list. I want to set the name of the self.data_name to be self.info using the setattr() function. How can I do this?

import csv

class import_data:

    def import_csv(self, filename_csv, data_name):


            setattr(self,data_name,0)

            datafile = ope开发者_开发问答n(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)

This does not work because b.data_name is not b.info. This prints 0 instead of the imported CSV file.


Try this:

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


You're going to have to replace all usages of self.data_name in the import_csv() function with calls to either setattr() or getattr() to be able to use the dynamic name.

Using self.data_name will use the member named data_name, as I suspect you've already realised, and that isn't what you want to do.

For example, try the following:

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

Make sure you take a look at eumiro's answer, which takes a better, more compact and more Pythonic approach to your specific problem using with and list(). However, the above should hopefully make it clear how you could be using setattr() in a wider variety of cases.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜