問題は、CSVの内容が変数ではなく文字列であることです。あなたのCSVファイルには、と文字通りの文字列 "jan1、A"が含まれています。さて、は、Pythonで変数名を直接操作することが可能です。すべてが(ほとんど)辞書がすべてダウンしているので、です。しかし、奇妙な、維持不能な、まったくの狂った道へと向かっていくことに気をつけてください。そのような「内部」を乱すことは、最大限の予防措置でのみ使用し、可能な限り避けるべきです。
あなたの問題:私は、Pythonは辞書がすべてダウンしていることを述べました。具体的には、vars()
、locals()
とglobals()
は、あなたが探しているものかもしれません:
>>> env = globals()
>>> a = 2
>>> env['a']
2
>>> env['b'] = 3
>>> b
3
それは何詐欺ですか? Pythonはscopeの状態を辞書に保持しており、はに直接アクセスし、他の辞書と同様に操作できます。具体的には、locals()
とglobals()
は直接アクセスできます。モジュールシステムは、(各モジュールが独自にglobals
を保持しているので)少し複雑にしますが、あなたが1つのモジュールで動作しているとしましょう。
それでは、あなたがあなたのインタプリタを起動し、以下の変数定義されていると仮定してみましょう:
>>> A = 1
>>> B = 2
>>> C = 3
をそして、あなたはjan1
、jan2
、jan3
は、...これらの変数のために、に応じて新しい変数を定義したいですあなたのCSVで指定されたルール。私たちは今のCSV部分を無視してみましょう(csv
モジュールについてのダニー・カレンの答えはそのためにかなりスポットがある)、そして私たちはあなたがタプルのリストにあなたのCSVをロードしたと仮定しましょう:あなたは今
>>> csv
[('jan1', 'A'),
('jan2', 'B'),
('jan3', 'C'),
('jan4', 'A'),
('jan5', 'B'),
('jan6', 'C')]
変数jan1
を値の変数A
に設定します。あなたのモジュールのglobals()
辞書を修正し、locals()
あなたの変数の値を取得することによってそれを行うことができます全体の読み取りを自動化
>>> glob = globals()
>>> loc = locals()
>>> glob['jan1'] = loc['A']
>>> jan1
1
はその後、簡単です:
これはあなたの問題を解決します
>>> for var_to_set, value_to_get in csv:
... glob[var_to_set] = loc[value_to_get]
>>>
>>> jan5
2
、しかし、私は他の人が言ったことを強調させてください:これは危険で、完全に維持できないので、一般的に避けるべきです!その理由の1つは、 'string'から 'variable'(これまで行ったこと)に行くのはかなり簡単だということです。その一方で、は不可能です変数から文字列に戻る! jan1
は値を保持していますが、それ以外の場合は、"jan1"
と参照することはできません。だからプロセスは損失であるです。一方、あなたのマッピングで様々な辞書を持ち歩くことは、これらの '可変ルックアップ'フープ(キーを同期させたままにすること)を経ることなく、いつでも「逆戻り」することができます。
さらに、私はモジュールが異なるグローバルを持っていることに言及しました。そのウサギの穴は、関数、クラス、モジュール、パッケージがすべてローカルスコープを定義し、さまざまな場合にグローバルおよびローカルをさまざまに参照するときに深くなります。この例は小さなプロジェクトではうまく動作しますが、は不可能ですこれを拡大するには変数の辞書で手を汚すようになったときに、誰がどこでどのようにレンダリングするのかを追跡します。
あなた本当には、「変数定義」の道を行かなければならない場合は、私は非常にあなたがPythonでscoping rulesに慣れる示唆し、コードのように見えていない」コードを追跡するかなりの数の頭痛のための準備を取得'...
この回答は、私が約4つ以上の+1を与えることができればと願っています。 –
非常に有用で驚くべき回答のおかげで、すべてに感謝します!私は辞書やスコープ、プロジェクトそのものについて考える必要があるようです。 – Aulbaer