Я file.readline() некоторый файл реестра, чтобы отфильтровать некоторые подстроки. Я делаю его копию (просто для сохранения оригинала), используя shutdown.copyfile(), обрабатывая foo() и не вижу ничего отфильтрованного. Пробовал отладку и содержимое строк очень бинарное:
'˙ţW\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x00R\x00e\x00g\x00i\x00s\x00t\x00r\x00y\x00 \x00E\x00d\x00i\x00t\x00o\x00r\x00 \ x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\x005\x00.\x000\x000\x00\n'
что довольно очевидно, но не знал об этом (в Notepad++ аккуратное представление текста). Мой вопрос: как я могу отфильтровать свои строки? Я вижу два варианта: подход reg->txt->reg (что я имел в виду под заголовком) или преобразование там строк в байты, а затем сравнение их с содержимым.
Когда я создаю файлы вручную (копирую и вставляю содержимое входного файла) и даю им .txt, все работает нормально, но я бы хотел, чтобы это можно было автоматизировать.
inputfile = "filename_in.reg"
outputfile = "filename_out.reg"
copyfile(inputfile, output file)
with open(outputfile, 'r+') as fd:
contents = fd.readlines()
for d in data:
foo(fd, d, contents)
Готово - сделал комментарий только потому, что я не был Конечно, который мог бы это исправить, - но я надеялся, что это, по крайней мере, поможет вам начать.
Файлы Reg обычно имеют кодировку UTF-16 (обычно упоминается в документации MS как «Unicode». Похоже, ваша отладка обрабатывает данные как 8-битные символы (поэтому существует множество \x00
для старших байтов 16-битного кода). символов) Notepad++ можно заставить отображать кодировку UTF-16.
Исправление состоит в том, чтобы сообщить Python, что текст, который вы читаете, имеет формат UTF-16:
open(outputfile, 'r+', encoding='utf16')
Это совершенно так. Возможно, вы захотите добавить его в качестве ответа, поэтому я могу его принять. Большое спасибо - мелочь, но очень приятно :)