如何将文件中的文本用作变量名?

时间:2017-02-21 00:54:30

标签: python class variables xlrd xlutils

如何将文件中的文本用作变量名? 我从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)

感谢您宝贵的时间。

2 个答案:

答案 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的内容进行交换,您的程序对于阅读代码的人来说仍然看起来相同。因此,简单地让变量命名为personemployee或其他任何东西更有意义,因为它可以代表任何员工(事实上,当您遍历电子表格内容时,通常会变量将一次携带一个人的数据。)

尽管如此,有时候我们确实想要在程序中拥有具有程序化标签的数据。但仍然在这些情况下 - 这就是字典的用法 - 创建一个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)

将按照您的要求运作 - 但很容易看出它没用。