Как да чета по един знак наведнъж от файл в python?

Искам да прочета в списък с числа от файл като символи един знак наведнъж, за да проверя какво представлява този знак, дали е цифра, точка, + или -, 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))

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).
  • partial създава функция с нула аргументи, като винаги извиква 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
Прав си, но нито един разумен метод наистина не чете символ по знак от магнита. Има поне три слоя на буфериране, може би повече. Добавянето на още един слой няма особено значение IMO. :-) - person Veky; 04.07.2017