我的问题是,如果除了下面有任何其他方法一次迭代一个文件一个字符?
with open(filename) as f:
while True:
c = f.read(1)
if not c:
print "End of file"
break
print "Read a character:", c
由于没有一个函数来检查是否有像Java中那样的东西,所以还有其他方法。此外,在示例中,当变量c到达文件末尾时,它会是什么?感谢任何人的帮助。
答案 0 :(得分:8)
另一种选择是使用itertools.chain.from_iterable()
:
import itertools
with open("test.txt") as f:
for c in itertools.chain.from_iterable(f):
print(c)
chain.from_iterable
创建一个iterable,它返回给定iterable中第一个iterable的元素,直到它耗尽,然后进入下一个iterable,直到所有的iterables都用完为止。通常这用于展平列表列表,但在这种情况下,它允许您忽略行。
这是否真的比嵌套循环更好是另一回事(它会更快一点,但这不太重要),但值得一提。
答案 1 :(得分:7)
这是一种方式:
with open(filename) as f:
for line in f:
for c in line:
pass
或者这个怎么样?
with open(filename) as f:
for c in f.read():
pass
答案 2 :(得分:3)
以下是文件对象的其他方法:
'关闭', '文件编号', “冲洗”, 'isatty', “换行”, '下一个', '读', 'readinto', '的ReadLine', 'readlines方法', '寻求', 'softspace', '告诉', '截短', '写', 'writelines', '把xreadlines'
您可以在documentation中阅读。
如果没有其他内容可读,变量c
将为空字符串。它的计算结果为False,因此测试if not c
为True。这表示您位于文件的末尾。
答案 3 :(得分:2)
另一种方法是使用发电机:
def blocks(infile, bufsize=1024):
while True:
try:
data=infile.read(bufsize)
if data:
yield data
else:
break
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
break
f=open('somefile.txt','rb')
for c in blocks(f,1):
print c
使用生成器,整个文件不会保存在内存中,底层操作系统通常会对光盘读取执行足够的缓冲。
作为一个生成器,它将像任何其他迭代一样;当文件中没有更多字符要读时它会中断。