пропускать пробел сразу при чтении из файла

#python #python-3.x

#python #python-3.x

Вопрос:

Я делаю проект (язык python), который включает в себя использование OCR (с использованием tesseract-ocr) для получения текста из изображения и сохранения его в файл. Затем я должен прочитать файл посимвольно и выполнить некоторые функции для обнаруженных символов. Проблема, с которой я столкнулся, заключается в том, что иногда файл, созданный после преобразования, содержит много пробелов (даже пустых строк) в начале текстового файла. Мне не нужно использовать какую-либо функцию для пробелов, поэтому я хочу игнорировать их все сразу, чтобы это могло сэкономить мое время. Я запускаю код на raspberry-pi, у которого очень мало памяти, и требуется некоторое время, чтобы сравнить каждый символ и пропустить один за другим.

 camera.capture('test.png')

camera.resolution = (1920, 1080)
camera.brightness = 60 

call(["tesseract","/home/pi/Desktop/fyp_try/test.png","/home/pi/Desktop/fyp_try/totext"])

f = open('/home/pi/Desktop/fyp_try/totext.txt','r')

message = f.read()
print(message)

for i in message:
    print(i)
    if(i>='a')and(i<='z'):
        lst=a[i]
        lstoperate()
    elif(i>='A')and(i<='Z'):
        lst=a['dot']
        stoperate()
       time.sleep(2)
        smol=i.lower()
        lst=a[smol]
        lstoperate()
    elif (i>='0')and(i<='9'):
        lst=a['numsign']
        lstoperate()
        print(ord(i))
  ..............
  

за операцией с каждым символом следует время ожидания в 2-3 секунды. это также происходит, когда встречаются пробелы.
Есть ли какой-либо способ, которым я могу игнорировать все пробелы сразу до начала символа, отличного от пробела, в файле при его чтении.

Комментарии:

1. Вы читаете весь файл сразу, поэтому вы могли бы использовать message = message.lstrip() для удаления пробелов из начала файла.

2. Спасибо @John Szakmeister, я думаю, это должно сработать. Но что, если в моем файле снова много пробелов между двумя строками?

3. Новые строки считаются пробелами, поэтому они тоже будут удалены.

4. О, и в цикле вы могли бы выполнить проверку на i.isspace() и continue в цикле также пропускать символы пробела, которые встречаются в сообщении, если это полезно.

5. Спасибо. Только что обнаружил, что это можно сделать, также комбинируя функции join и strip.

Ответ №1:

Если вы хотите удалить все пробелы за одну операцию с низкими затратами ресурсов, вам следует избегать split / join (который работает, но имеет высокую стоимость временной памяти).

Есть два очевидных подхода, подход с отложенной фильтрацией:

  from itertools import filterfalse

 ...

 for i in filterfalse(str.isspace, message):
     ...
  

который никогда не создает нового str , а просто отфильтровывает символы, о которых вы не заботитесь, по ходу работы.

Или, чтобы удалить их все заранее (удвоив начальное потребление памяти, но затем перейдя только к тому, что требуется для урезанной версии), используйте str.translate :

  from string import whitespace

 dropspaces = str.maketrans('', '', whitespace)

 ...

 message = f.read().translate(dropspaces)
  

Это удалит все пробелы ASCII, как если бы это было сделано .replace(' ', '').replace('n', '').replace('r', '').etc... , но за один проход, создавая единственную выходную строку со всеми пробелами, удаленными сразу.

Ответ №2:

Может быть выполнено с использованием различных функций strip и join, как упоминал Джон Сакмейстер. Также можете обратиться к этой ссылке.