Py学习  »  Python

将项目从python文件写入字典

bbfav360 • 3 年前 • 1382 次点击  

我试图从一个文件中编写列表,并将它们定义为字典中的独立值。文本文件的外观如下所示:

[12, 13, 14]
[87, 45, 32]
...

然后字典看起来像这样:

{"score_set0": [12, 13, 14], "score_set1": [87, 45, 32]...}

这是我到目前为止得到的代码,但它只返回一个空字典

def readScoresFile(fileAddr):
    dic = {}
    i = 0
    with open(fileAddr, "r") as f:
        x = len(f.readlines())
        for line in f:
            dic["score_set{}".format(x[i])] = line
            i += 1
    return dic

我只在10年级的GCSE水平(英国OCR教学大纲,如果有帮助的话)上编程。谢谢大家的帮助

我也尝试在没有pickle模块的情况下实现这一点

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133475
 
1382 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Samwise
Reply   •   1 楼
Samwise    3 年前

如果您试图将这些行转换为实际的Python列表,我建议使用 json 单元(另一个选择是 ast.literal_eval ,因为在本例中,语法恰好相同。)

import json

def read_scores_file(file_path):
    with open(file_path) as f:
        return {
            f"score_set{i}": json.loads(line)
            for i, line in enumerate(f)
        }
ShadowRanger
Reply   •   2 楼
ShadowRanger    3 年前

x = len(f.readlines()) 消耗了你的整个文件,所以你接下来的循环就结束了 f 正在迭代耗尽的文件句柄,看不到剩余的行,并且立即存在。

这里不需要预先检查长度(也是你唯一使用的长度) x 试图给它编制索引,这毫无意义;你避开了 TypeError 仅仅是因为循环从未运行过),所以只需忽略这一点,然后使用 enumerate 要边走边获取数字,请执行以下操作:

def readScoresFile(fileAddr):
    dic = {}
    with open(fileAddr, "r") as f:
        for i, line in enumerate(f):  # Let enumerate manage the numbering for you
            dic["score_set{}".format(i)] = line  # If you're on 3.6+, dic[f'score_set{i}'] = line is nicer
    return dic

请注意,这实际上并不会将输入行转换为 list s的 int (你的原始代码也没有)。如果你想这样做,你可以改变:

dic[f'score_set{i}'] = line

致:

dic[f'score_set{i}'] = ast.literal_eval(line)  # Add import ast to top of file

要将该行解释为Python文字,或:

dic[f'score_set{i}'] = json.loads(line)  # Add import json to top of file

将每一行解释为JSON(速度更快,但支持的Python类型更少,一些合法的Python文本不是合法的JSON)。

一般来说,你根本不想使用 .readlines() ; 只需在文件句柄上进行迭代,就可以激活这些行,并避免与文件大小成比例的内存需求。(坦白地说,如果他们在Py3中处理掉它,我会更喜欢,因为 list(f) 如果你真的需要它,它也会得到同样的结果,而且它不会创建一个可见的方法来鼓励你经常做“错误的事情”)。

通过逐行操作,您最终可以存储所有 数据 ,但这比将解析后的数据存储在 dict 所有的字符串数据都来自 列表 .