Коллеги, необходимо найти все вхождения в файле по формату "data\model\папка\папка\файл.расширение". Их может быть несколько. Структуру файла копать времени нет (файл не текстовый), поэтому решил пойти путём поиска первого совпадения и нахождения первого вхождения формата файла (tga, dds в обоих регистрах), после чего извлечения среза (файл[начало:конец]). Данный скрипт возвращает слишком много совпадений из несуществующих мест. Где я мог допустить ошибку?
# -*- coding: utf-8 -*-
import os
import glob
folder = r"C:\files\data\model"
final_folder = r"C:\files\data\model_patched"
files = glob.glob(folder + r'\**\*.fskin', recursive=True)
filecount = 0
oc_count = 0
for file in files:
with open(file, 'r+b') as f:
fcontent = f.read()
fcontent = fcontent.decode("utf-16", errors='ignore')
cur_pos = 0
extensions = ['.TGA', '.DDS', '.tga', '.dds']
occurences = []
print("file {}:".format(file))
while cur_pos != -1:
string_begin = fcontent.find(r"data\model", cur_pos)
cur_pos = string_begin # начинаем с 0 или конца предыдущего вхождения
string_end = 0
cur_pos_iter = int(cur_pos) # Чтобы не перезаписать cur_pos
while string_begin != -1:
ch = fcontent[cur_pos_iter:cur_pos_iter+4] # берём 4 символа с текущей позиции
if ch not in extensions: # если не находим, увеличиваем счётчик на 1 и идём дальше
cur_pos_iter += 1
else: # Если находим, ищем вхождение целиком, ставим курсор на конец вхождения и глушим цикл
string_end = cur_pos_iter+4
occurence = fcontent[string_begin:string_end]
cur_pos = string_end
print("Found {} [{}:{}]".format(occurence, string_begin, string_end))
oc_count += 1
else:
filecount += 1
filename_relative = file[file.find('model')+5:]
new_filename = final_folder+filename_relative
# os.makedirs(os.path.dirname(new_filename), exist_ok=True)
# with open(new_filename, 'wb') as fw:
# fw.write(bytearray(fcontent, 'utf-16'))
# fw.close()
f.close()
print("Done. Replaced {} occurences in {} files.".format(filecount, oc_count))