Python: 如何正确使用 readline() 和 readlines()
Python: How to properly use readline() and readlines()
我已经构建了一个 Python 脚本,根据 Gödel, Escher, Bach 提供的图表,使用普林斯顿英语 Wordnet 中的数据随机创建句子。调用 python GEB.py
会产生一个英文无意义句子的列表,例如:
重新审美成本。
苔藓植物的指甲
厌恶桃花四十。
星光隐藏。
take_a_dare 一拳打穿applewood 的面粉谁翻译长袍谁重新请求enfeoff。
金枪鱼旁边的半边莲。
并将它们保存到 gibberish.txt。这个脚本工作正常。
另一个脚本 (translator.py
) 采用 gibberish.txt 并通过 py-googletrans Python 模块尝试将那些随机句子翻译成葡萄牙语:
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中第一个句子的翻译。类似于:
重新审美成本。
aumento de custos inestético.
我尝试使用 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 新手,如果有人能帮助我,我将不胜感激。
如果你正在使用 readline()
函数,你必须记住这个函数只有 return 一行,所以你必须使用循环遍历文本文件中的所有行.在使用 readlines()
的情况下,此函数会立即读取整个文件,但 return 列表中的每一行。列表数据类型不可散列,不能用作 dict
对象中的键,这就是 if keyword in data:
行发出此错误的原因,因为 keyword
这里是所有行的列表。一个简单的 for 循环将解决这个问题。
text_lines = open('/home/user/gibberish.txt', 'r').readlines()
for line in text_lines:
buscaLocal(line)
此循环将遍历列表中的所有行,访问字典时会出错,因为关键元素将是一个字符串。
让我们从您对文件对象执行的操作开始。您打开一个文件,从中获取一行,然后不要关闭它。更好的方法是处理整个文件然后关闭它。这通常使用 with
块来完成,即使发生错误也会关闭文件:
with open('gibberish.txt') as f:
# do stuff to f
除了 material 的好处之外,这将使界面更加清晰,因为 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)
我已经构建了一个 Python 脚本,根据 Gödel, Escher, Bach 提供的图表,使用普林斯顿英语 Wordnet 中的数据随机创建句子。调用 python GEB.py
会产生一个英文无意义句子的列表,例如:
重新审美成本。 苔藓植物的指甲 厌恶桃花四十。 星光隐藏。 take_a_dare 一拳打穿applewood 的面粉谁翻译长袍谁重新请求enfeoff。 金枪鱼旁边的半边莲。
并将它们保存到 gibberish.txt。这个脚本工作正常。
另一个脚本 (translator.py
) 采用 gibberish.txt 并通过 py-googletrans Python 模块尝试将那些随机句子翻译成葡萄牙语:
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中第一个句子的翻译。类似于:
重新审美成本。 aumento de custos inestético.
我尝试使用 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 新手,如果有人能帮助我,我将不胜感激。
如果你正在使用 readline()
函数,你必须记住这个函数只有 return 一行,所以你必须使用循环遍历文本文件中的所有行.在使用 readlines()
的情况下,此函数会立即读取整个文件,但 return 列表中的每一行。列表数据类型不可散列,不能用作 dict
对象中的键,这就是 if keyword in data:
行发出此错误的原因,因为 keyword
这里是所有行的列表。一个简单的 for 循环将解决这个问题。
text_lines = open('/home/user/gibberish.txt', 'r').readlines()
for line in text_lines:
buscaLocal(line)
此循环将遍历列表中的所有行,访问字典时会出错,因为关键元素将是一个字符串。
让我们从您对文件对象执行的操作开始。您打开一个文件,从中获取一行,然后不要关闭它。更好的方法是处理整个文件然后关闭它。这通常使用 with
块来完成,即使发生错误也会关闭文件:
with open('gibberish.txt') as f:
# do stuff to f
除了 material 的好处之外,这将使界面更加清晰,因为 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)