2017-01-26 8 views
0

私は現在、csvファイルから辞書を書くのに苦労しています。csvファイルからのPythonの書き込み辞書

2-6行は生徒の名前、各テストで自分のテストの点数です
student, Test 1, Test 2, Test 3, Final Exam 
A,   9,  19, 9,  22 
B,   10,  16, 9,  26 
C,   11,  17, 8,  27 
D,   7,  14, 9,  18 
E,   8,  20, 8,  23 
weight,  0.15, 0.25, 0.2,  0.4 
max_points 12  20  9  30 

csvファイルの形式は次のようです。 最後の2つの行は、各テストの重みと各テストのフルスコアを別々に表します。

は今、私は次のようになります。このリストから辞書を作成したい:

キーは、変数の学生を除き、CSVファイルの最初の行の変数です
{'Test 1': {'weight': '0.15', 'max_points': '12'}, 
'Test 2': {'weight': '0.25', 'max_points': '20'}, 
'Test 3': {'weight': '0.2', 'max_points': '9'}, 
'Final Exam': {'weight': '0.4', 'max_points': '30'}} 

。それぞれのネストされた辞書では、キーはcsvファイルの最初の列と最後の2つの行の名前です:weight、max_points。対応する値は、それぞれの行の値です。

私は今では出ている唯一のものがある:

reader = csv.DictReader(open('gradebook.csv')) 
for row in reader: 
    key = row.pop('Student') 

そして私は続行する方法については考えています。本当にありがとうございました!!!

+0

あなたのファイルは、CSVファイルではありません。 CSVファイルの列はカンマで区切られます。 – DyZ

+0

@DYZは技術的には真ですが、今ではすべての区切られたテキストファイルをCSVとして呼び出すことが一般的になっています。それが間違っているとは言えません。それは普通です。 – e4c5

+0

@ e4c5数字「数字」を呼び出すのが一般的になってきました。それは数字にするのではないですか?基本に戻るのは痛いことではありません。 – DyZ

答えて

3

利用パンダ、それは1つのライナー

import pandas as pd 

df = pandas.read_csv('myfile.csv', delim_whitespace=True) 
{ k: { 'max_points': df[k].max(), 'weight': df[k][5] } for k in df.keys()[1:] } 

編集です。 中にエラーが、パンダが適切に

df = pd.read_csv('/tmp/df.txt',delim_whitespace=True, header=1, names=['Student','Test 1','Test 2','Test 3','Final Score']) 
+0

しかし、私はパンダを使わずにこれを行うことができますか? – Parker

+0

もちろん難しいことはありません:-) – e4c5

+0

これはクールな解決策です。私はパンダにもっと慣れる必要があります。私は重量のために 'min()'を試みましたが、csvからの値はバイナリ数値としてはあまりありません:) –

2

をあなたのヘッダーを認識しない場合、私はちなみに

{ k: { 'max_points': df[k][6], 'weight': df[k][5] } for k in df.keys()[1:] } 

)OPが実際に(最大探しではありませんtaht参照ここではそのパンダを使用していない解決策ですあなたがしたいことをする必要があります。ただし、私のcsvファイルは実際の csvファイルなので、それに応じてリーダー作成を調整する必要があるかもしれません。

In [13]: reader = csv.DictReader(open('tests.csv')) 

In [14]: record = defaultdict(dict) 

In [15]: for row in reader: 
    ...: if row['Student'] == 'weight': 
    ...:  for header in reader.fieldnames[1:]: 
    ...:   record[header]['weight'] = row[header] 
    ...: if row['Student'] == 'max_points': 
    ...:  for header in reader.fieldnames[1:]: 
    ...:   record[header]['max_points'] = row[header] 


In [17]: from pprint import pprint 

In [18]: pprint(record) 
defaultdict(<class 'dict'>, 
      {'Final Exam': {'max_points': '30', 'weight': '0.4'}, 
      'Test 1': {'max_points': '12', 'weight': '0.15'}, 
      'Test 2': {'max_points': '20', 'weight': '0.25'}, 
      'Test 3': {'max_points': '9', 'weight': '0.2'}}) 

あなたは、コンストラクタに渡すものは何でも、前defaultdictを見ていない場合は、あなたがまだ存在しないキーにアクセスしようとしたときの値として使用されるものです。

+0

ありがとうございました。しかし、私はこれらのキーにアクセスせずにこれを行うことができます。私はレコードを行わずにこれを行うことができます['test 1'] ['weight'] = row ['test 1']? – Parker

+0

パンダを使用したくない場合は、この回答を受け入れる必要があります – e4c5

+0

@Parkerは複数のテストのために更新されました。 –

関連する問題