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)

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

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

自然地,按照您的数据进行结构化。

使用这些模块之一意味着您不需要将自己的序列化/反序列化到/从文件滚动。

当然,如果你觉得你必须自己滚动,例如,如果其他东西(你无法控制)以这种格式期待它,那么你可以在编写时简单地将换行符连接到字符串到文件中,就像您所做的那样。这不按预期工作吗?

编辑:

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

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

这将在每一行写入由空格分隔的键和值。您可能需要更改它以适应字典的数据结构和您想要的输出格式。

还值得注意的是,您的阅读是以迂回的方式完成的,请考虑:

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 回答