我有一个从CSV文件导入数据的类,以及一个采用文件名和输出列表名称的函数。我想使用self.info
函数将self.data_name的名称设置为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文件。
答案 0 :(得分:2)
试试这个:
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")
答案 1 :(得分:0)
您需要通过调用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()
对您的特定问题采用更好,更紧凑和更Pythonic的方法。但是,上述内容应该有助于说明如何在更广泛的案例中使用setattr()
。