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
和
所有的字符串数据都来自
列表
.