Python:在循环中逐字符读取文本文件
例如,有一个文本文件包含从0到9的数字: 0123456789 使用以下函数,我希望得到如下输出:Python:在循环中逐字符读取文本文件,python,python-3.x,Python,Python 3.x,例如,有一个文本文件包含从0到9的数字: 0123456789 使用以下函数,我希望得到如下输出: >>> print_char('filename') 0 >>> print_char('filename') 1 >>> print_char('filename') 2 . . . >>> print_char('filename') 9 也就是说,每次我调用函数时,它都会返回下一个数字 以下是我的功能: def pri
>>> print_char('filename')
0
>>> print_char('filename')
1
>>> print_char('filename')
2
.
.
.
>>> print_char('filename')
9
也就是说,每次我调用函数时,它都会返回下一个数字
以下是我的功能:
def print_char(filename):
f = open(filename, 'r')
while True:
char=f.read(1)
if not char:
break
print(char)
…以及我得到的输出:
>>> print_char('filename')
0
1
2
3
.
.
.
9
那么,如何创建在每次调用时逐个字符返回的函数呢 我将采用不同的方法,并创建一个函数,该函数接受返回生成器的文件名:
def reader(filename):
with open(filename) as f:
while True:
# read next character
char = f.read(1)
# if not EOF, then at least 1 character was read, and
# this is not empty
if char:
yield char
else:
return
然后只需给出一次文件名
r = reader('filename')
并且文件保持打开状态,以便更快地进行操作。要提取下一个字符,请使用next
内置函数
print(next(r)) # 0
print(next(r)) # 1
...
您还可以在此对象切片字符上使用itertools
,例如islice
,或者在for
循环中使用该工具:
# skip characters until newline
for c in r:
if r == '\n':
break
您需要在
print\u char
函数调用之间以某种方式共享状态(已读取或刚打开文件的字符数)。您可以使用全局变量,尽管这种方法被认为是一种糟糕的设计。您真的需要具有这种行为的print\u char
免费函数吗?您建议的API不好<代码>x=读取器('filename');x、 next();x、 next()…会更好。@JonathonReinhartnext(x)
。我意识到出于某种原因,我假设您的文件是换行分隔的,所以我的解决方案对您没有帮助,因为您没有换行分隔的文件。Antti发布的新解决方案应该满足您的需求。这假设文件中没有NUL字节,如果有,将提前终止。我将把if char
测试(在NUL上失败)更改为更明确的if len(char)==1
。