テキストファイルに辞書を書く?


95

辞書を持っていて、ファイルに書き込もうとしています。

exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'r') as file:
    file.write(exDict)

その後、エラーが発生します

file.write(exDict)
TypeError: must be str, not dict

だから私はそのエラーを修正しましたが、別のエラーが発生しました

exDict = {111:111, 222:222}
with open('file.txt', 'r') as file:
    file.write(str(exDict))

エラー:

file.write(str(exDict))
io.UnsupportedOperation: not writable

私はまだPythonの初心者なので、どうしたらよいかわかりません。誰かが問題を解決する方法を知っているなら、答えを提供してください。

注:私はPython2ではなくPython3を使用しています

回答:


153

まず、ファイルを読み取りモードで開いて、そこに書き込もうとしています。相談-IOモードpython

次に、ファイルに書き込むことができるのは文字列のみです。辞書オブジェクトを作成する場合は、文字列に変換するか、シリアル化する必要があります。

import json

# as requested in comment
exDict = {'exDict': exDict}

with open('file.txt', 'w') as file:
     file.write(json.dumps(exDict)) # use `json.loads` to do the reverse

シリアル化の場合

import cPickle as pickle

with open('file.txt', 'w') as file:
     file.write(pickle.dumps(exDict)) # use `pickle.loads` to do the reverse

Python 3.xの場合、pickleパッケージのインポートは異なります

import _pickle as pickle

1
それはうまくいきました!ただし、辞書の内容のみを書き込みます。次のように書くことができますか:exDict = {111:111、222:222}
Nic

私はそれを考えましたが、もっと良い方法があると思いました。動作しますのでよろしくお願いします!
ニック2016年

あなたが=サインにあまり執着していなければ、私が行った編集がその仕事をするかもしれません。
hspandher 2016年

以前の方法:file.write( 'exDict =' + json.dumps(exDict))は、現在使用しているので問題なく機能しました。
ニック2016年

1
@JanKukackaJSONは標準のデータ形式です。str(exDict)生成されるものが常に有効なJSONであるとは限りません。頭の後ろからの理由の1つは、JSONファイルでは一重引用符が無効であるのに対し、strメソッドを使用すると存在する可能性があることです。
hspandher

50

私はPython3でこのようにします:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)

1
インポートする必要がないので、これが好きです。data.write(str(dictionary))の上の答えは、ファイルに<class'dict '>を書き込むだけなので、正しい辞書では機能しません
Si Mon

私も興味がありますことの一つは、()「W」、mydictionary、ファイル=オープン(「myfile.txtの」)だけで印刷をしない理由です
MadmanLee

@MadmanLeeどちらも問題ないと思いますが、コードがどのように見えるかが問題です。
NKSHELL

1
open( 'myfile.txt'、 'r')をfとして使用:content = f.read(); dic = eval(content);
NKSHELL

jsonが単にstr(mydict)ファイルに書き込むよりも優れている理由はevaldictオブジェクトを元に戻すためにコンテンツを処理する必要がないためです。 evalはセキュリティロスクであり、より適切なオプションが利用可能な場合は使用しないでください。
snakecharmerb

23
fout = "/your/outfile/here.txt"
fo = open(fout, "w")

for k, v in yourDictionary.items():
    fo.write(str(k) + ' >>> '+ str(v) + '\n\n')

fo.close()

12
コードのみの回答は、問題の解決方法を説明していないため、お勧めできません。回答を更新して、この質問がすでに持っている他の受け入れられ、賛成された回答をどのように改善するかを説明してください。良い答えを書くにはどうすればよいかを確認してください。
FluffyKitten 2017

また、あなたが使用する必要がありますwithから読み込み、ファイルに書き込むときのステートメントを:stackoverflow.com/questions/3012488/...
ファルコ

13

最初のコードブロックの問題は、を使用してファイルに書き込みたい場合でも、ファイルを「r」として開いていたことです。 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))

質問内のコードにエラーがあるため、これは正解です。
リカルドリバウド2018年

jsonルートを試してみると、floatにいくつかの「NaN」値があるため失敗します。JSONを記述したい場合、データ自体に損傷を与えることなく修正することはできません。したがって、この回答は、テキストファイルを保存して口述を正確に反映できるため、推奨される回答です。
pauljohn 3220年

7

ファイルから名前でインポートできる辞書が必要で、適切に並べ替えられ、保持したい文字列を含むエントリが追加される場合は、次の方法を試すことができます。

data = {'A': 'a', 'B': 'b', }

with open('file.py','w') as file:
    file.write("dictionary_name = { \n")
    for k in sorted (data.keys()):
        file.write("'%s':'%s', \n" % (k, data[k]))
    file.write("}")

次にインポートするには:

from file import dictionary_name

これは文字列に対してのみ機能し、辞書内の他のタイプに対しては機能しません。
ポールケンジョラ

4

リスト内包表記の愛好家のために、これはすべてのkey : valueペアを新しい行に書き込みますdog.txt

my_dict = {'foo': [1,2], 'bar':[3,4]}

# create list of strings
list_of_strings = [ f'{key} : {my_dict[key]}' for key in my_dict ]

# write string one by one adding newline
with open('dog.txt', 'w') as my_file:
    [ my_file.write(f'{st}\n') for st in list_of_strings ]

1

これは古い質問ですが、jsonを使用しないソリューションを共有することも考えました。jsonはデータを簡単に追加できないため、個人的にはあまり好きではありません。開始点が辞書の場合、最初にそれをデータフレームに変換してから、txtファイルに追加できます。

import pandas as pd
one_line_dict = exDict = {1:1, 2:2, 3:3}
df = pd.DataFrame.from_dict([one_line_dict])
df.to_csv('file.txt', header=False, index=True, mode='a')

これがお役に立てば幸いです。


1
なぜ単純なタスクに外部ライブラリを使用するのですか?PythonSimpleがより良い原則です。
リカルドリバウド2018年

私が使用するほとんどの辞書は、便利なDataFrameオブジェクトになるほど単純ではないため、あまり役に立ちません。
pauljohn 3220年

1
exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'w+') as file:
    file.write(str(exDict))


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.