【问题标题】:How to read in one character at a time from a file in python?如何从python中的文件一次读取一个字符?
【发布时间】:2014-09-01 19:15:35
【问题描述】:

我想从文件中读取一个数字列表作为字符,一次一个字符来检查该字符是什么,无论是数字、句点、+ 或 -、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))

【问题讨论】:

  • 您真的需要一次读取一个字节,还是一次只处理一行?一次读取一个字节比一次读取一行或整个文件要慢得多。您仍然可以选择一次跳过一个字符的数据。
  • 是的,我需要使用底部三行代码来读取文件。我不确定的部分是使用它一次读取一个字符。我需要在函数 is_float 中一次检查每个字符。

标签: python file floating-point


【解决方案1】:

这是一种制作一次一个字符的文件迭代器的技术:

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-statement 打开文件,完成后无条件关闭它。
  • read one character 的常用方法是f.read(1)
  • partial 通过始终使用参数 1 调用 f.read 创建一个零参数函数。
  • iter() 的两个参数形式创建一个迭代器,该迭代器循环直到您看到空字符串文件结束标记。

【讨论】:

  • 这很漂亮,但它并没有回答问题。
【解决方案2】:

事实上,这要容易得多。 itertools 中有一个很好的实用程序,但经常被忽略。 ;-)

for character in itertools.chain.from_iterable(open('file.data')):
    process(character)

【讨论】:

  • 请注意,这实际上一次读取一行,但只是逐个字符处理。不一定是问题,但值得一提。
  • 你是对的,但没有一个理智的方法真的从磁铁中逐个字符地读取。至少涉及三层缓冲,也许更多。添加一层并不重要IMO。 :-)
【解决方案3】:

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() 函数中执行此操作,对吗?
猜你喜欢
  • 2011-02-28
  • 2014-03-21
  • 2014-04-14
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2015-07-17
  • 2021-03-07
相关资源
最近更新 更多