从python中的文件中读取单个字符?

时间:2012-05-02 22:51:51

标签: python file-io

我的问题是,如果除了下面有任何其他方法一次迭代一个文件一个字符?

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 个答案:

答案 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

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

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