#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, как упоминал Джон Сакмейстер. Также можете обратиться к этой ссылке.