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

用python从文件中读取单个字符?,python,file-io,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到达文件末尾时,它会是什么?感谢任何人的

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

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

这是一种方法:

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

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

“结束”, “文件号”, "齐平",, “isatty”, “新线”, “下一个”, “读”, “读入”, “readline”, “阅读线”, “寻找”, “软空间”, “告诉”, “截断”, “写”, "writeline",, “xreadlines”

你可以在报纸上看到

如果没有更多可读取的内容,变量
c
将是一个空字符串。它的计算结果为False,因此测试
如果不是c则为True。这表示您在文件末尾。

另一个选项是使用:

chain.from_iterable
生成一个iterable,该iterable返回给定iterable中第一个iterable中的元素,直到耗尽为止,然后继续到下一个iterable,直到耗尽所有iterable。通常,这用于平展列表列表,但在这种情况下,它允许您忽略行


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

另一种方法是使用生成器:

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


作为一个发电机,它将像任何其他iterable一样工作;当文件中没有更多字符可读取时,它将中断

是的,这是“重复”代码,但不是同一个问题。如果你真的费心去读另一个问题,他得到了他的答案,而我想知道我一直在尝试的其他方法。谢谢你指出这一点…+1。第一种解决方案通常更好,因为后者可能会导致非常大的文件出现问题(内存不足)。谢谢。@Lattyware:第一个也一样,因为文件可能包含很长的行:P@nightcracker没错,但几率要低得多。哈哈,你们太棒了/谢谢!顺便问一句,什么是通行证?但是把一个通行证连起来没有多大意义。在这种情况下,只需使用文件对象本身。@Keith确实如此。他们询问需要的字符,所以文件是一个可编辑的行-这是字符串,这是可编辑的。Keith:您可以将文件对象视为iterable over iterables,因为当对其进行迭代时,它返回字符串(iterable)。感谢您的输入@Lattyware@tommy.carstensen它是懒惰的,文件将根据需要加载。@nightcracker下面是问题:
还有什么其他方法。另外,在这个例子中,当变量c到达文件末尾时,它会是什么?
很公平,它回答了这个问题。
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