首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:如何正确使用readline()和readline()

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

Stack Overflow用户
提问于 2018-12-25 04:12:49
回答 2查看 8.7K关注 0票数 1

我构建了一个Python脚本,它使用普林斯顿英语Wordnet中的数据随机创建句子,下面是戈德尔、埃舍尔、巴赫提供的图表。调用python GEB.py会在英语中产生一系列无意义的句子,例如:

复苏的麻醉剂成本。苔藓植物指甲。讨厌的第40个桃子。星体的隐藏。翻译婚纱的面粉,take_a_dare通过苹果木打了一拳,再次请求enfeoff。金枪鱼旁边的一艘货轮。

并将它们保存到gibberish.txt中。这个剧本很好用。

另一个脚本(translator.py)使用gibberish.txt并通过py-googletrans模块尝试将这些随机句子翻译成葡萄牙语:

代码语言:javascript
复制
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(),但是我得到了以下错误:

代码语言:javascript
复制
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新手,如果有人能帮我的话,我会很感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-25 05:31:23

让我们从您对文件对象所做的事情开始。打开一个文件,从它得到一行,然后不要关闭它。更好的方法是处理整个文件,然后关闭它。这通常是通过with块完成的,即使发生错误,也会关闭文件:

代码语言:javascript
复制
with open('gibberish.txt') as f:
    # do stuff to f

除了实际的好处之外,这将使界面更加清晰,因为f不再是一个丢弃的对象。处理整个文件有三个简单的选项:

  1. 在循环中使用readline,因为它一次只读取一行。当''出现时,您必须手动删除换行符并终止循环: 而True: line = f.readline()如果不是line: break关键字= line.rstrip() buscaLocal(关键字) 这个循环可以采取多种形式,其中一种形式如下所示。
  2. 使用readlines一次将文件中的所有行读入字符串列表: 对于f.readlines()中的行:关键字= line.rstrip() buscaLocal(关键字) 这比前面的选项要干净得多,因为您不需要手动检查循环终止,但它的缺点是一次性加载整个文件,而readline循环则不这样做。 这就引出了第三种选择。
  3. Python文件是可迭代对象。您可以通过节省readlines的内存来保持readline方法的整洁性: f: buscaLocal(line.rstrip())中的行 可以使用readline和更神秘的next来模拟这种方法,以创建类似的迭代器: 对于下一行(f.readline,''):buscaLocal(line.rstrip())

另外,我要对您的功能做一些修改:

代码语言:javascript
复制
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)
票数 7
EN

Stack Overflow用户

发布于 2018-12-25 05:01:56

如果您使用的是readline()函数,您必须记住这个函数只返回一行,所以您必须使用一个循环来遍历文本文件中的所有行。在使用readlines()的情况下,这个函数会同时读取完整的文件,但是返回列表中的每一行。列表数据类型是不可访问的,不能用作dict对象中的键,这就是为什么if keyword in data:行会发出这个错误,因为这里的keyword是所有行的列表。一个简单的for循环将解决这个问题。

代码语言:javascript
复制
text_lines = open('/home/user/gibberish.txt', 'r').readlines()
for line in text_lines:
     buscaLocal(line)

这个循环将遍历列表中的所有行,当关键元素为字符串时,访问dict时会出现错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53919299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档