2016-07-19 41 views
0

私は初心者のPythonプログラマーですので、答えは簡単かもしれません。しかし、私はこの1つの質問を調査して数日間過ごしましたが、私は困惑しています。これは私の最初のStack Overflow投稿ですので、ここでいくつかのルールを破っているなら、親切にしてください。 :)Python:辞書をテキストファイル(CSV?)に書き込み、そのテキストファイルを辞書に読み込みます。

Pythonを使用して、複数の行にある2つのフィールドを新しいテキストファイルに書き出し、後でそのテキストファイルを新しい辞書に読み込んで、以前の値を参照します。

私がここで見つけたコードをテストしています:Example codeです。提供されたソリューションには64件の投票権があり、質問者から最高の回答とマークされています。だから、ほとんどの人にとって正しいと思われる。

私のテストコードは、初期辞書mydictの作成に成功し、それをテキストファイルに保存します。ただし、テキストファイルを新しい辞書mydict2に読み込もうとすると、何も表示されません。何も表示されず、エラーメッセージも何も表示されず、何も表示されません。

私はここで何が欠けていますか?それが作成されること

import csv 

mydict = {1:11,2:22,3:33} 
print mydict 
print mydict[1] 

writer = csv.writer(open('dict.csv', 'wb')) 
for key, value in mydict.items(): 
    writer.writerow([key, value]) 

reader = csv.reader(open('dict.csv', 'rb')) 
mydict2 = dict(reader) 

print mydict2 
ここ

テキストファイルの内容は以下のとおりです:ここ

1,11 
2,22 
3,33 

は、私が実行したときに結果がを表示

です。ここ

は私の テストコードですテストコード:

{1: 11, 2: 22, 3: 33} 
11 
{} 

最初の2行の結果出力からわかるように、最初の出力辞書mydictが正しく作成され、参照値が表示されます。ただし、3行目の出力には、テキストファイルからデータを読み込んだ新しい辞書mydict2の内容が表示されます。しかし、テキストファイルの内容は何らかの形で空である新しい辞書に読み込まれませんでした。

これを修正してテキストファイルの内容を辞書に読み込む方法はありますか?

答えて

1

問題がファイルを閉じていません。元のファイルが完全にディスクにフラッシュされませんでした。 withブロックが終了すると、withステートメントはファイルを自動的に閉じます。

import csv 

mydict = {1:11,2:22,3:33} 
print mydict 
print mydict[1] 

with open('dict.csv','wb') as f: 
    writer = csv.writer(f) 
    for key, value in mydict.items(): 
     writer.writerow([key, value]) 

with open('dict.csv','rb') as f: 
    reader = csv.reader(f) 
    mydict2 = dict(reader) 

print mydict2 

出力:

{1: 11, 2: 22, 3: 33} 
11 
{'1': '11', '3': '33', '2': '22'} 
+0

それだけです!それはファイルの競合かもしれないと思ったが、write文とread文の間でファイルを閉じる方法の簡潔な例を見つけることができなかった。 もう少し詳しく調べました。読者を直接閉じる方法はありません。提案された構文は、あなたが使用したもの、つまりWITH文です。 – dwwheelock

+0

@dwwheelock問題はファイル競合ではありませんが、バッファリング:データは書き込み直後にディスクに保存されませんが、バッファをいっぱいにすると(シーケンシャル書き込みの場合)、または何らかの操作を実行すると内容をフラッシュするように強制するファイルで(シーク、フラッシュ、クローズ、...)そして、あなたは読者を閉じることはできません(読者が使用するファイルオブジェクトを閉じることができます)。私は元の例を 'with'を使うように修正しました - 私は辞書を使って読み書きする方法を示し、基本的なファイルの意味を教えるのではなく...。 –

+0

あなたの例に対する追加の解説と更新をありがとうございました。 – dwwheelock

0

私は次のことがすべてわかりません最も洗練された答え、。明らかに.csvファイルの絶対パスを指定すると助けになりました。以下は、作成したcsvから読み込んだ、目的の辞書オブジェクトを提供します:

import csv 

mydict = {1:11,2:22,3:33} 
print(mydict) 
print(mydict[1]) 

with open('C:\\Python27\\dict.csv', 'wb') as writer: 
    writer = csv.writer(writer) 
    for item in mydict.items(): 
     writer.writerow(item) 

with open('C:\\Python27\\dict.csv', 'rb') as reader: 
    reader = csv.reader(reader) 
    for line in reader: 
     mydict2[int(line[0])] = int(line[1]) 
    #mydict2 = {line[0]:line[1] for line in reader} ...build mydict2 as a comprehension. 

print(mydict2) 

最高の幸運!

+0

これは役に立ちます。ありがとう、ジム。絶対パスは必要ありませんでしたが、あなたが作った他の変更は動作させるように見えます。私はまだそのシンプルなコードがとても多くの人のために働いていたのですが、私にとってはそれがなぜ不思議です。他の誰かがそれについてのアイデアを持っているならばチャットしてください。 – dwwheelock

0

そしてこれがあります。ファイルも閉じます。コーチングの人に感謝します!

import csv 

mydict = {1:11,2:22,3:33} 
print mydict 
print mydict[1] 

f = open('dict.csv', 'wb') 
writer = csv.writer(f) 
for key, value in mydict.items(): 
    writer.writerow([key, value]) 
f.close() 

f = open('dict.csv', 'rb') 
reader = csv.reader(f) 
mydict2 = dict(reader) 
f.close() 

print mydict2 
関連する問題