4 回答
TA贡献1864条经验 获得超2个赞
让我们从您对文件对象执行的操作开始。你打开一个文件,从中得到一行,然后不要关闭它。更好的方法是处理整个文件然后关闭它。这通常是通过一个with块完成的,即使发生错误,它也会关闭文件:
with open('gibberish.txt') as f:
# do stuff to f
除了物质上的好处,这将使界面更清晰,因为f它不再是一次性物品。您可以通过三个简单的选项来处理整个文件:
readline在循环中使用,因为它一次只能读取一行。您必须手动去除换行符并在''出现时终止循环:
while True:
line = f.readline()
if not line: break
keyword = line.rstrip()
buscaLocal(keyword)
此循环可以采用多种形式,此处显示了其中一种形式。
用于readlines一次将文件中的所有行读入字符串列表:
for line in f.readlines():
keyword = line.rstrip()
buscaLocal(keyword)
这比前一个选项干净得多,因为您不需要手动检查循环终止,但它的缺点是一次加载整个文件,而readline循环则没有。
这将我们带到了第三种选择。
Python 文件是可迭代对象。您可以readlines通过以下内存节省获得该方法的清洁度readline:
for line in f:
buscaLocal(line.rstrip())
可以使用readline更神秘的形式来模拟此方法next以创建类似的迭代器:
for line in next(f.readline, ''):
buscaLocal(line.rstrip())
顺便说一句,我会对您的功能进行一些修改:
def buscaLocal(keyword):
if keyword not in data:
buscaAPI(keyword)
print(keyword + data[keyword])
def buscaAPI(keyword):
# Make your function do one thing. In this case, do a lookup.
# Printing is not the task for this function.
result = tradutor.translate(keyword, dest="pt")
# No need to do a complicated update with a whole new
# dict object when you can do a simple assignment.
data[keyword] = result.text
...
# Avoid rewriting the file every time you get a new word.
# Do it once at the very end.
with open('data.json', 'w') as fp:
json.dump(data, fp)
TA贡献1796条经验 获得超7个赞
如果你使用readline()函数,你必须记住这个函数只返回一行,所以你必须使用循环来遍历文本文件中的所有行。在使用的情况下readlines(),此函数会立即读取整个文件,但会返回列表中的每一行。List 数据类型是不可散列的,不能用作dict对象中的键,这就是if keyword in data:line 发出此错误的原因,因为keyword这里是所有行的列表。一个简单的 for 循环将解决这个问题。
text_lines = open('/home/user/gibberish.txt', 'r').readlines()
for line in text_lines:
buscaLocal(line)
这个循环将遍历列表中的所有行,并且访问 dict 会出错,因为关键元素将是一个字符串。
添加回答
举报