我构建了一个Python脚本,它使用普林斯顿英语Wordnet中的数据随机创建句子,下面是戈德尔、埃舍尔、巴赫提供的图表。调用python GEB.py会在英语中产生一系列无意义的句子,例如:
复苏的麻醉剂成本。苔藓植物指甲。讨厌的第40个桃子。星体的隐藏。翻译婚纱的面粉,take_a_dare通过苹果木打了一拳,再次请求enfeoff。金枪鱼旁边的一艘货轮。
并将它们保存到gibberish.txt中。这个剧本很好用。
另一个脚本(translator.py)使用gibberish.txt并通过py-googletrans模块尝试将这些随机句子翻译成葡萄牙语:
from googletrans import Translator
import json
tradutor = Translator()
with open('data.json') as dataFile:
data = json.load(dataFile)
def buscaLocal(keyword):
if keyword in data:
print(keyword + data[keyword])
else:
buscaAPI(keyword)
def buscaAPI(keyword):
result = tradutor.translate(keyword, dest="pt")
data.update({keyword: result.text})
with open('data.json', 'w') as fp:
json.dump(data, fp)
print(keyword + result.text)
keyword = open('/home/user/gibberish.txt', 'r').readline()
buscaLocal(keyword)目前,第二个脚本只输出gibberish.txt中第一个句子的翻译。类似于:
复苏的麻醉剂成本。奥门托·德托管人在埃斯特蒂科
我尝试使用readlines()而不是readline(),但是我得到了以下错误:
Traceback (most recent call last):
File "main.py", line 28, in <module>
buscaLocal(keyword)
File "main.py", line 11, in buscaLocal
if keyword in data:
TypeError: unhashable type: 'list'我在这里读过类似的关于这个错误的问题,但我不清楚我应该使用什么来读取gibberish.txt中包含的所有句子(新句子以新行开头)。
我如何阅读gibberish.txt中包含的全部句子列表?为了实现这一点,我应该如何调整translator.py中的代码?如果问题有点混乱,我很抱歉,如果有必要,我可以编辑,我是Python新手,如果有人能帮我的话,我会很感激的。
发布于 2018-12-25 05:31:23
让我们从您对文件对象所做的事情开始。打开一个文件,从它得到一行,然后不要关闭它。更好的方法是处理整个文件,然后关闭它。这通常是通过with块完成的,即使发生错误,也会关闭文件:
with open('gibberish.txt') as f:
# do stuff to f除了实际的好处之外,这将使界面更加清晰,因为f不再是一个丢弃的对象。处理整个文件有三个简单的选项:
readline,因为它一次只读取一行。当''出现时,您必须手动删除换行符并终止循环:
而True: line = f.readline()如果不是line: break关键字= line.rstrip() buscaLocal(关键字)
这个循环可以采取多种形式,其中一种形式如下所示。readlines一次将文件中的所有行读入字符串列表:
对于f.readlines()中的行:关键字= line.rstrip() buscaLocal(关键字)
这比前面的选项要干净得多,因为您不需要手动检查循环终止,但它的缺点是一次性加载整个文件,而readline循环则不这样做。
这就引出了第三种选择。readlines的内存来保持readline方法的整洁性:
f: buscaLocal(line.rstrip())中的行
可以使用readline和更神秘的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)发布于 2018-12-25 05:01:56
如果您使用的是readline()函数,您必须记住这个函数只返回一行,所以您必须使用一个循环来遍历文本文件中的所有行。在使用readlines()的情况下,这个函数会同时读取完整的文件,但是返回列表中的每一行。列表数据类型是不可访问的,不能用作dict对象中的键,这就是为什么if keyword in data:行会发出这个错误,因为这里的keyword是所有行的列表。一个简单的for循环将解决这个问题。
text_lines = open('/home/user/gibberish.txt', 'r').readlines()
for line in text_lines:
buscaLocal(line)这个循环将遍历列表中的所有行,当关键元素为字符串时,访问dict时会出现错误。
https://stackoverflow.com/questions/53919299
复制相似问题