在Python中,f.readline()
返回文件f
中的下一行。也就是说,它从f
的当前位置开始,读取直到遇到换行符,返回介于两者之间的所有内容并更新f
的位置。
现在我想要完全相同,但是对于空格分隔的文件(不仅仅是换行符)。例如,考虑具有内容
的文件f
token1 token2
token3 token4
token5
所以我正在寻找一些函数readtoken()
,这样在f
打开后,f.readtoken()
的第一次调用会返回token1
,第二次调用会返回token2
等等。
为了提高效率并避免长线或非常大的文件出现问题,应该没有缓冲。
我几乎可以肯定这应该可以通过标准库“开箱即用”。但是,我没有找到任何合适的函数或方法来重新定义readline()
的分隔符。
答案 0 :(得分:8)
您需要创建一个包装函数;这很容易:
def read_by_tokens(fileobj):
for line in fileobj:
for token in line.split():
yield token
请注意,.readline()
不会只是逐个字符地读取文件,直到遇到换行符为止;以块(缓冲区)读取文件以提高性能。
上述方法按行读取文件,但会在空格上生成结果。使用它像:
with open('somefilename') as f:
for token in read_by_tokens(f):
print(token)
因为read_by_tokens()
是一个生成器,你需要直接在函数结果上循环,或者使用next()
function逐个获取标记:
with open('somefilename') as f:
tokenized = read_by_tokens(f)
# read first two tokens separately
first_token = next(tokenized)
second_token = next(tokenized)
for token in tokenized:
# loops over all tokens *except the first two*
print(token)