用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