如何在Python中从文件中逐个读取字符?

9
我希望从一个文件中逐个字符读取数字列表,检查它是数字、句点、加号、减号、e或E还是其他字符,并根据需要执行相应的操作。我该如何使用已有的代码实现这一功能?以下是我尝试过但未成功的示例。我是Python新手。谢谢!
    import sys

    def is_float(n):
        state = 0
        src = ""
        ch = n
        if state == 0:
            if ch.isdigit():
                src += ch
                state = 1
                ...

    f = open("file.data", 'r')
    for n in f:
        sys.stdout.write("%12.8e\n" % is_float(n))

1
你是否真的需要逐字节“读取”,还是仅需要逐行“处理”?逐字节读取远比一次读取一行或整个文件慢得多。你仍然可以选择逐个字符地浏览数据。 - Bryan Oakley
是的,我需要使用代码底部的三行来读取文件。我不确定的部分是如何一次一个字符地读取它。我需要逐个检查每个字符在函数is_float中。 - Harley Jones
请阅读以下有关在Python中读取二进制文件的内容:https://dev59.com/LXNA5IYBdhLWcg3wQ7Yw - jfs
3个回答

53

这里有一种技术可以制作一个逐个字符迭代的文件迭代器:

from functools import partial

with open("file.data") as f:
    for char in iter(partial(f.read, 1), ''):
        # now do something interesting with the characters
        ...
  • with语句在打开文件后,在结束时无条件关闭文件。
  • 通常读取一个字符的方法是f.read(1)
  • partial通过总是使用一个参数1来调用f.read,创建了一个零参数的函数。
  • iter()的两个参数形式会创建一个迭代器,直到看到空字符串结束标记为止。

那很好看,但它并没有回答问题。 - Michał Klich

2
实际上这非常容易。itertools 中有一个很好的实用程序,经常被忽视。;-)
for character in itertools.chain.from_iterable(open('file.data')):
    process(character)

请注意,这实际上是逐行阅读,但仅以字符为单位进行处理。这不一定是问题,但值得一提。 - zondo
你说得没错,但是没有一个理智的方法会从磁带上逐个字符地读取。至少涉及到三层缓冲,可能还有更多。在我看来,再添加一层并不重要。 :-) - Veky

1

for x in open() 读取文件中的每一行。将整个文件作为文本块读入,然后逐个字符浏览:

import sys

def is_float(n):
    state = 0
    src = ""
    ch = n
    if state == 0:
        if ch.isdigit():
            src += ch
            state = 1
            ...

data = open("file.data", 'r').read()
for n in data: # characters
    sys.stdout.write("%12.8e\n" % is_float(n))

好的,我明白了。那么我该如何从数据中读取每个字符呢?我应该在 is_float() 函数内部执行这个操作,对吗? - Harley Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接