Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在循环中逐字符读取文本文件_Python_Python 3.x - Fatal编程技术网

Python:在循环中逐字符读取文本文件

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

例如,有一个文本文件包含从0到9的数字:

0123456789

使用以下函数,我希望得到如下输出:

>>> 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()…会更好。@JonathonReinhart
next(x)
。我意识到出于某种原因,我假设您的文件是换行分隔的,所以我的解决方案对您没有帮助,因为您没有换行分隔的文件。Antti发布的新解决方案应该满足您的需求。这假设文件中没有NUL字节,如果有,将提前终止。我将把
if char
测试(在NUL上失败)更改为更明确的
if len(char)==1