为了账号安全,请及时绑定邮箱和手机立即绑定

Python:如何正确使用 readline() 和 readlines()

Python:如何正确使用 readline() 和 readlines()

犯罪嫌疑人X 2021-09-24 16:51:08
根据Gödel、Escher、Bach提供的图表,我已经构建了一个 Python 脚本来使用普林斯顿英语 Wordnet 中的数据随机创建句子。Callingpython GEB.py会生成一系列无意义的英语句子,例如:复苏的不美观成本。苔藓指甲。厌恶四十桃。星光隐藏。翻译礼服的面粉,敢于在苹果木上打一拳,重新提出要求。金枪鱼旁边的半叶状货轮。并将它们保存到 gibberish.txt。这个脚本工作正常。另一个脚本 ( translator.py) 接受 gibberish.txt 并通过 py-googletrans Python 模块尝试将这些随机句子翻译成葡萄牙语:from googletrans import Translatorimport jsontradutor = 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 新手,如果有人能帮助我,我将不胜感激。
查看完整描述

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)


查看完整回答
反对 回复 2021-09-24
?
芜湖不芜

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 会出错,因为关键元素将是一个字符串。


查看完整回答
反对 回复 2021-09-24
  • 4 回答
  • 0 关注
  • 348 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信