0

辞書をファイルに書き込もうとしていますが、それを文字列に変更する必要があることは既にわかっています。ただし、ファイルを整理するために最後に「\ n」を追加する方法はありますか?

コードは次のとおりです。

def dictionary(grocerystock):

    with open('grocery_stock.txt','r+') as f:
        lines = f.readlines()

# filter out empty lines
    lines = [line for line in lines if line.strip() != '']

# split all lines
    lines = [line.split() for line in lines]

# convert to a dictionary
    grocerystock = dict((a, (b, c)) for a, b, c in lines)

# print
    for k, v in grocerystock.items():
        print (k, v)

    grocerystock=str(grocerystock)


    grocerystock=grocerystock.replace("{",'')
    grocerystock=grocerystock.replace("}",'')
    grocerystock=grocerystock.replace("(",'')
    grocerystock=grocerystock.replace(")",'')
    grocerystock=grocerystock.lstrip()
    grocerystock=grocerystock.rstrip()
    grocerystock=grocerystock.strip()
    grocerystock=grocerystock.replace(":",'')
    c=(grocerystock+("\n"))


    e=open('grocery_stock.txt', 'w+')

    e.write(c)
    e.close()

どんな助けでも大歓迎です。

4

1 に答える 1

7

dict単にファイルに保存することが目的の場合は、単純にpickleを使用できますが、読みやすさへの懸念があるため、人間が読めるようにしたいと思います。その場合は、JSONを検討することをお勧めします。

import json

with open('grocery_stock.txt', 'r') as file:
    grocery_stock = json.load(file)

...

with open('grocery_stock.txt', 'w') as file:
    json.dump(grocery_stock, file, indent=4)

これにより、Python リテラルに似たJSON出力が生成されます。

{
    "title": "Sample Konfabulator Widget",
    "name": "main_window",
    "width": 500,
    "height": 500
}

当然、データがそのまま構造化されます。

これらのモジュールのいずれかを使用すると、ファイルとの間で独自のシリアライズ/デシリアライズを行う必要がなくなります。

もちろん、自分で作成する必要があると感じた場合、たとえば、他の何か (制御できないもの) がこの形式でそれを期待している場合は、文字列を記述するときに単純に改行文字を文字列に連結できます。あなたがしたように、ファイルに。これは期待どおりに機能しませんか?

編集:

既存のコードが期待どおりに機能しない理由は、辞書全体を文字列に変換し、最後に改行を 1 つ追加しているためです。すべての行の最後に改行が必要なため、問題は解決しません。 . 手動で行う必要がある場合、dict をループして、必要に応じて項目を書き出すのが最善の方法です。

with open('grocery_stock.txt', 'w') as file:
    for key, value in grocery_stock.items():
        file.write(key+" "+value+"\n")

これにより、各行にスペースで区切られたキーと値が書き込まれます。dict のデータ構造と必要な出力の形式に合わせて、これを変更する必要がある場合があります。

また、あなたの読書が回りくどい方法で行われていることに注意する価値があります。

with open('grocery_stock.txt','r') as file:
    grocery_stock = {key: value for key, *value in (line.split() for line in file if line.strip())}

ただし、最初に述べたように、これはデータをシリアル化する脆弱な方法であり、車輪の再発明であることを忘れないでください。制御できない他の何かがこのフォーマットを必要としない限り、標準のフォーマットを使用して労力を節約してください。

于 2012-04-17T00:23:17.667 に答える