2016-04-15 18 views
0

私はコーディングで絶対にnoobieです。だから私は解決すべき問題がある。 まず私は、たとえば次のように見ているCSVファイルを持っている:PythonでCSVファイルから変数を作成する方法

text.csv:

jan1、
jan2、B
jan3、C
jan4、
jan5、B
jan6、C

今私はPythonのプログラムの開発にCSVからこの「データ」をインポートする、第ので、変数はCSVファイルから直接作られていますで:

jan1=A 
jan2=B 
... 

Aが文字列としてインポートされるべきではないと発言してください、変数をそれ `s。 CSVリーダーでCSVをインポートすると、すべてのデータが文字列としてインポートされますか?

答えて

1

問題は、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 

をそして、あなたはjan1jan2jan3は、...これらの変数のために、に応じて新しい変数を定義したいですあなたの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に慣れる示唆し、コードのように見えていない」コードを追跡するかなりの数の頭痛のための準備を取得'...

+0

この回答は、私が約4つ以上の+1を与えることができればと願っています。 –

+0

非常に有用で驚くべき回答のおかげで、すべてに感謝します!私は辞書やスコープ、プロジェクトそのものについて考える必要があるようです。 – Aulbaer

0

あなたが何をしようとして

https://docs.python.org/2/library/csv.html

import csv 
    with open('test.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',', quotechar='"') 
    for row in reader: 
     print ', '.join(row) 
0

のpython CSVモジュールを使用することは可能なはずですが、一般には良いものと見なされていない...代わりに辞書を使用してください。

foovar = {'A': 1, 'B': 2, 'C': 3, ...} # Dictionary to store your 'variables' 
jan1 = foovar['A'] 
jan2 = foovar['B'] 
... 

あなたの最初のカラム件のデータ(jan1、jan2、...)は、変数名として使用する必要がある場合には、あまりにもそのための辞書を使用しています。

1

コードに変換すると、データとコードの境界を越えたいと思うようです。これは危険な可能性があるため、一般的にはお勧めしません(あなたのコンピュータを消去したcsvファイルにコマンドを追加した場合はどうなりますか?)。

は代わりに、単にカンマでファイルの行を分割し、最初の部分を保存し、変数名を、辞書のキーとして第二の部分に値を作る:

csv_dict = {} 

with open(csv_file, "r") as f: 
    for line in f: 
     key_val = line.strip().split(",") 
     csv_dict[key_val[0]] = key_val[1] 

あなたは今のキーにアクセスすることができます/辞書検索を経由して値:

>>> csv_dict["jan5"] 
'B' 
>>> csv_dict["jan4"] 
'A' 
>>> my_variable = data_dict["jan4"] 
>>> my_variable 
'A' 
0

あなたが本当に変数にあなたのCSVを回し達成したい場合は、あなたが行うことができます:

row = "jan1,A" 
exec("%s = %s" % (row.split(",")[0], row.split(",")[1])) 

しかし、前もってAを定義する必要があります。

しかし、他にも触れられているように、実際は非常にお勧めです。データとコードをマッピングする正しい方法は、辞書を使用することです。

関連する問題