2017-02-21 13 views
0

ファイルのテキストを変数名として使用するにはどうすればよいですか? 私はExcelファイルから値を引き出しています。 私は、スプレッドシートのうち、従業員を引っ張ってるの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 

でxlrdとxlutilsを使用しています。 私は実際の名前を使用しようとしています。 私は実際の解決方法を知りたいです。 ありがとう!

編集:プログラミングについての私の無知と私の恐ろしいポスト。 私は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) 

ありがとうございます。

+1

サンプルテキストファイルを表示することができますし、目的の出力は何ですか?また、何をしようとしていますか? – NinjaGaiden

+3

あなたはそうではありません。あなたは間違った質問をしています。あなたがしようとしていることを教えてください。適切な解決策には、動的変数名ではなく、辞書が関与する可能性が高くなります。 –

+0

@NinjaGaiden私は 'John'のような従業員名を引き出し、次にJohn = employee( 'John')をしたいと思っています –

答えて

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__の場合。

+0

チャットできるように私のチャットボットの評判を得ようとしています。だから、そのアカウントの答えがここにあります。 –

0

スプレッドシートからの変数名は使用しないでください。 または1つ:変数名は実行中のプログラムの内部であり、出力ファイルに再度エクスポートするためのものではありません。

プログラムが実行されているときに変数が呼び出されて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の内容によって交換されるだろうしても、yurプログラムがまだコードを読んで誰かに同じように見えるでしょう:あなたの例では、このようなものになるだろう。したがって、変数がpersonまたはemployeeなどの名前になるようにするのは理にかなっています。従業員を表すことができます(実際にはスプレッドシートの内容をループするときに、通常、変数は1人の時間)。

プログラムのラベリングを行っているデータがプログラム内にあることが必要な場合があります。それでも、これらの例に - それは辞書をするためのものであるものです - 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()の呼び出しで返された辞書に保持されますが、コンパイル時に既知の変数に対してはうまく動作しません(その場合、ローカル変数はフレームオブジェクトにキャッシュされ、ローカル変数辞書はそう)

を、それが読み込まれたときにのみ、彼らとsynchornizedされていますが、彼らは地元の人々を経由して書き込むことができません。

def row_data(emp_name, *args): 
    globals()[emp_name] = employee(emp_name) 
    globals()[emp_name].bulk_hours(*args) 
    print(globals()[emp_name].monday) 

は、あなたが尋ねただけのように動作します - それは無用である見ることは容易です。

関連する問題