如何将文件中的文本用作变量名? 我从excel文件中提取值。 我正在使用xlrd和xlutils与python 3。
class employee(object):
def __init__(self, name):
self.name = name
emp_list.append(name)
def bulk_hours(self,sunday=0,monday=0,tuesday=0,wednesday=0,thursday=0,friday=0,saturday=0):
self.sunday = sunday
self.monday = monday
self.tuesday = tuesday
self.wednesday = wednesday
self.thursday = thursday
self.friday = friday
self.saturday = saturday
我将员工从电子表格中拉出来。 我正在尝试使用他们的实际名字。 我很想知道任何有效的解决方案。 谢谢!
编辑:请原谅我对编程和我可怕的帖子的无知。 我正在尝试制作一个简单的程序,允许我从Excel加载员工姓名和工作时间表。 我还会确保将所有修改都保存回电子表格中。 员工用他们的名字贴上标签。我正在尝试将其名称作为变量加载,以便我可以这样做:John = employee('John')
John.bulk_hours(0,8,8,8,8,8,0)
Stacy = employee('Stacy')
print(John.monday)
我的目标是使用他们的名字作为变量,我可以使用点符号。 这可行吗?他们是否应采取其他方式来解决这个问题?
def load(row):
employee2 = employee(s.cell(row, 0).value)
employee2.bulk_hours(s.cell(row, 1).value, s.cell(row, 2).value, s.cell(row, 3).value, s.cell(row, 4).value,
s.cell(row, 5).value, s.cell(row, 6).value, s.cell(row, 7).value)
print(employee2.saturday)
我正在尝试使用这样的函数来加载多个员工及其工作时间。
我可以以某种方式使用这样的列表吗?
worker = ['Joe']
worker[0] = employee('Joe')
worker[0].bulk_hours(0,8,8,8,8,8,0)
print(worker[0].monday)
感谢您宝贵的时间。
答案 0 :(得分:1)
覆盖 __getattr__
以透明方式访问内部词典。
class employee(object):
def __init__(self, ...):
self._internal_d = extract_data() # replace extract_data with however you extract CSV values to a dictionary
... # perform other initialization
def __getattr__(self, name):
try:
return self._internal_d[name]
except KeyError:
raise AttributeError()
或者,您可以实施 __setattr__
以允许编写属性。
def __setattr__(self, name, value):
return self._internal_d[name] = value
说明:当python执行变量赋值并且无法“正常”找到变量名时,它会检查对象是否有__getattr__
。如果是,则调用__getattr__
以获取具有指定名称的值。因此,您可以拥有动态变量名称。同样适用于__setattr__
。
答案 1 :(得分:0)
您不想使用来自电子表格的变量名称。 或者:变量名称是正在运行的程序的内部名称,并不打算再次导出到输出文件。
当程序运行时,变量被命名John
以表示John的数据是没有意义的。例如,假设可以创建一个特殊标记来使用变量名称 - 例如?
前缀来从另一个变量中获取名称。你的例子是这样的:
def row_data(emp_name, *args):
?emp_name = employee(emp_name)
?emp_name.bulk_hours(*args)
print(?emp_name.monday)
因此,即使在运行时?emp_name
将由变量name
的内容进行交换,您的程序对于阅读代码的人来说仍然看起来相同。因此,简单地让变量命名为person
或employee
或其他任何东西更有意义,因为它可以代表任何员工(事实上,当您遍历电子表格内容时,通常会变量将一次携带一个人的数据。)
尽管如此,有时候我们确实想要在程序中拥有具有程序化标签的数据。但仍然在这些情况下 - 这就是字典的用法 - 创建一个employees
字典并填充它 - 然后你可以将名字作为键:
employees = dict()
def row_data(emp_name, name):
person = employee(emp_name)
person.bulk_hours(*args)
employes[emp_name] = person
def print_employeers():
for person_name, person_data in employees.items():
print(person_name, person_data)
如您所见,可以打印所有员工数据,而无需输入他们的名字。此外,如果它是交互式程序,则可以使用它作为字典键来查找与用户输入的名称相关的数据。
但是,如果您打算让程序自己生成其他Python源文件,并以每个员工的.py
文件结束。在这种情况下,只需使用像Jinja2这样的模板引擎,或者只使用str的format
方法。 (仍然很难想象你为什么需要这样的东西)。
而且,为了得到一个完整的答案, 可以在Python中创建动态变量名。但是,您将处于我在此处第一个示例中描述的完全相同的情况。
任何正在运行的代码的全局变量都保存在常规Python字典中,该字典通过调用globals()
函数返回。类似地,局部变量的值保存在通过调用locals()
返回的字典中 - 尽管这些对编译时已知的变量表现不佳(在这种情况下,局部变量缓存在帧对象中) ,本地词典在阅读时只与它们同步,但它们不能通过当地人写出来)
所以:
def row_data(emp_name, *args):
globals()[emp_name] = employee(emp_name)
globals()[emp_name].bulk_hours(*args)
print(globals()[emp_name].monday)
将按照您的要求运作 - 但很容易看出它没用。