2

我的问题是除了下面是否还有其他方法可以一次遍历一个字符的文件?

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 确实到达文件末尾时,它会是什么?感谢任何人的帮助。

4

4 回答 4

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生成一个可迭代对象,该可迭代对象从给定可迭代对象中的第一个可迭代对象返回元素,直到它用尽,然后继续下一个可迭代对象,直到所有可迭代对象都用完。通常这用于展平列表列表,但在这种情况下,它允许您忽略行。

这是否真的比嵌套循环更好是另一回事(它会快一点,但这不太重要),但值得一提。

于 2012-05-02T23:06:34.283 回答
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
于 2012-05-02T22:59:07.810 回答
3

以下是文件对象的其他方法:

'close'、'fileno'、'flush'、'isatty'、'newlines'、'next'、'read'、'readinto'、'readline'、'readlines'、'seek'、'softspace'、'tell '、'截断'、'写入'、'writelines'、'xreadlines'

您可以在文档中阅读。

c如果没有更多要读取的内容,该变量将是一个空字符串。它评估为 False,因此测试if not c为 True。这表明您在文件的末尾。

于 2012-05-02T23:06:17.247 回答
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

使用生成器,整个文件不会保存在内存中,底层操作系统通常会对磁盘读取执行足够的缓冲。

作为生成器,它将像任何其他可迭代对象一样工作;当文件中没有更多字符要读取时,它将中断。

于 2012-05-03T02:00:07.383 回答