将项目从文件写入字典 python
Write items to a dictionary from a file python
我正在尝试从文件中编写列表并将它们定义为在字典中分隔值。文本文件看起来像这样:
[12, 13, 14]
[87, 45, 32]
...
然后字典看起来像这样:
{"score_set0": [12, 13, 14], "score_set1": [87, 45, 32]...}
这是我目前得到的代码,但它只是returns一个空字典
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 模块的情况下执行此操作
x = len(f.readlines())
消耗了您的整个文件,因此您随后对 f
的循环正在迭代一个耗尽的文件句柄,看不到剩余的行,并且立即存在。
此处 pre-check 的长度为零(您对 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
请注意,这实际上并没有将输入行转换为 int
的 list
(您的原始代码也没有)。如果你想这样做,你可以改变:
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()
;简单地迭代文件句柄将使您的行生效并避免与文件大小成比例的内存需求。 (F运行kly,如果他们在 Py3 中去掉它,我会更喜欢,因为如果你真的需要它,list(f)
会得到相同的结果,而且它不会创建一个可见的方法鼓励你经常做“错误的事”)。
通过操作 line-by-line,您最终存储了所有 数据 ,但这比将解析后的数据都存储在 dict
中的开销加倍要好和它来自list
的所有字符串数据。
如果您尝试将这些行转换为实际的 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)
}
我正在尝试从文件中编写列表并将它们定义为在字典中分隔值。文本文件看起来像这样:
[12, 13, 14]
[87, 45, 32]
...
然后字典看起来像这样:
{"score_set0": [12, 13, 14], "score_set1": [87, 45, 32]...}
这是我目前得到的代码,但它只是returns一个空字典
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 模块的情况下执行此操作
x = len(f.readlines())
消耗了您的整个文件,因此您随后对 f
的循环正在迭代一个耗尽的文件句柄,看不到剩余的行,并且立即存在。
此处 pre-check 的长度为零(您对 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
请注意,这实际上并没有将输入行转换为 int
的 list
(您的原始代码也没有)。如果你想这样做,你可以改变:
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()
;简单地迭代文件句柄将使您的行生效并避免与文件大小成比例的内存需求。 (F运行kly,如果他们在 Py3 中去掉它,我会更喜欢,因为如果你真的需要它,list(f)
会得到相同的结果,而且它不会创建一个可见的方法鼓励你经常做“错误的事”)。
通过操作 line-by-line,您最终存储了所有 数据 ,但这比将解析后的数据都存储在 dict
中的开销加倍要好和它来自list
的所有字符串数据。
如果您尝试将这些行转换为实际的 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)
}