Как читать по одному символу из файла в Python?

Я хочу прочитать список чисел из файла как символы по одному символу за раз, чтобы проверить, что это за символ, будь то цифра, точка, + или -, e или E или какой-либо другой символ. ..и затем выполнить любую операцию, которую я захочу на основе этого. Как я могу это сделать, используя уже имеющийся у меня код? Это пример, который я пробовал, но не сработал. Я новичок в питоне. Заранее спасибо!

    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))

person Harley Jones    schedule 01.09.2014    source источник
comment
вам действительно нужно читать по одному байту или просто обрабатывать одну строку за раз? Чтение одного байта за раз будет намного медленнее, чем чтение одной строки или всего файла за раз. У вас по-прежнему есть возможность переходить через данные по одному символу за раз.   -  person Bryan Oakley    schedule 02.09.2014
comment
Да, мне нужно использовать три нижних строки кода, чтобы прочитать файл. Часть, в которой я не уверен, использует это, чтобы читать по одному символу за раз. Мне нужно проверять каждый символ по одному в функции is_float.   -  person Harley Jones    schedule 02.09.2014
comment
связанные: stackoverflow.com/questions/1035340/   -  person jfs    schedule 08.09.2014


Ответы (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))
person johntellsall    schedule 01.09.2014
comment
Хорошо, я вижу. Как мне тогда читать каждый символ из данных? Я бы сделал это внутри функции is_float (), правильно? - person Harley Jones; 02.09.2014

Вот методика создания односимвольного файлового итератора:

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 открывает файл и безоговорочно закрывает его, когда вы закончите.
  • Обычный способ прочитать один символ - f.read(1).
  • партиал создает функцию без аргументов, всегда вызывая f.read < / em> с аргументом 1.
  • Форма с двумя аргументами iter () создает итератор, который выполняет цикл пока вы не увидите маркер конца файла с пустой строкой.
person Raymond Hettinger    schedule 01.09.2014
comment
Это красиво, но не отвечает на вопрос. - person Michał Klich; 02.09.2014

На самом деле это намного проще. В itertools есть хорошая утилита, которой часто пренебрегают. ;-)

for character in itertools.chain.from_iterable(open('file.data')):
    process(character)
person Veky    schedule 02.07.2017
comment
Обратите внимание, что это фактически читает по одной строке за раз, но просто обрабатывает символ за символом. Не обязательно проблема, но стоит упомянуть. - person zondo; 02.07.2017
comment
Вы правы, но ни один разумный метод действительно не считывает символ за символом с магнита. Здесь задействовано как минимум три уровня буферизации, а может и больше. ИМО, добавление еще одного слоя на самом деле не имеет значения. :-) - person Veky; 04.07.2017