在将字典写入文件时,在字典末尾添加'\n'

bra*_*adb 0 python python-3.x

我正在尝试将我的字典写入文件,并且已经知道我必须将其更改为字符串.但是有没有办法在末尾添加'\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()
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Gar*_*tty 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)
Run Code Online (Sandbox Code Playgroud)

这将产生JSON输出,看起来类似于Python文字:

{
    "title": "Sample Konfabulator Widget",
    "name": "main_window",
    "width": 500,
    "height": 500
}
Run Code Online (Sandbox Code Playgroud)

当然,结构与您的数据一样.

使用其中一个模块意味着您无需将自己的序列化/反序列化转换为文件.

当然,如果你觉得你必须自己滚动,例如,如果其他东西(你不能控制)期望它采用这种格式,那么你可以在编写时简单地将换行符连接到字符串你似乎已经完成了该文件.这不能按预期工作吗?

编辑:

您现有代码无法正常工作的原因是您将整个字典转换为字符串,然后在最后添加一个换行符 - 这不会解决您的问题,因为您希望在每行的末尾添加换行符.如果你必须手动完成,最好的方法是循环你的dict,根据需要写出项目:

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

这将写入由每行上的空格分隔的键和值.您可能需要更改此选项以适应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())}
Run Code Online (Sandbox Code Playgroud)

正如我在开头所说的那样,记住这是序列化数据的一种脆弱方式,并且正在重新发明轮子 - 除非你不控制的其他东西需要这种格式,使用标准格式并节省你自己的努力.