Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 5, 2012 17:58:51

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

Здравствуйте!
Потребовалось заменить несколько слов в нетекстовом файле. В файле карты для навигатора если быть точным. Если открыть файл в hex-редакторе, некоторые слова вполне читаются, их и надо заменить. Но питон по умолчанию открывает файл как текстовый. Поэтому обычный скрипт по замене не работает.

import re
output_file = open("1.img","w")
data = open("2.img").read()
output_file.write( re.sub("name1","name2",data)  )
output_file.close()
Как заставить питона работать в этом случае?
Спасибо!

Офлайн

#2 Ноя. 5, 2012 18:46:57

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

open(fname, ‘wb’). В твоем вопросе уже практически есть ответ.

Офлайн

#3 Ноя. 5, 2012 18:55:32

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

Тогда вылезает вот такая ошибка:

Traceback (most recent call last):
File “C:\1\Wiki\re.py”, line 3, in <module>
data = open(“C1/Wiki/05010017.img”).read()
File “C:\python33\lib\encodings\cp1251.py”, line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)
UnicodeDecodeError: ‘charmap’ codec can't decode byte 0x98 in position 5414: cha
racter maps to <undefined>

Отредактировано dnstuff (Ноя. 5, 2012 18:56:12)

Офлайн

#4 Ноя. 5, 2012 19:35:46

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

читать нужно тоже в бинарном режиме и строковые литералы заменить на байтовые.

Офлайн

#5 Ноя. 5, 2012 20:21:36

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

adray
читать нужно тоже в бинарном режиме и строковые литералы заменить на байтовые.
Т.е. в read добавить rb? А как заменить строковые литералы на байтовые?

Офлайн

#6 Ноя. 5, 2012 21:29:14

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

dnstuff
Т.е. в read добавить rb?
да
dnstuff
А как заменить строковые литералы на байтовые?
b'content'

Офлайн

#7 Ноя. 5, 2012 21:50:33

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

Какая ветка питона?

Офлайн

#8 Ноя. 6, 2012 07:03:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

dnstuff
re.sub("name1","name2",data)
достаточно bytes.replace()

>>> b'abcd'.replace(b'bc', b'bbcc')
b'abbccd'
>>>



Офлайн

#9 Ноя. 6, 2012 08:27:33

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

Всем спасибо!
Конечный вариант

import re
output_file = open("C:/1/Wiki/1.img","wb")
data = open("C:/1/Wiki/2.img", "rb").read()
output_file.write( re.sub(b"aaa",b"bbb",data)  )
output_file.close()

Офлайн

#10 Ноя. 6, 2012 11:42:02

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Замена символов в нетекстовых файлах.

Возникла проблема с синтаксисом в случае, когда в

output_file.write( re.sub(b"aaa",b"bbb",data)  )
заменяемые символы задаются не явно, а через переменные.
Если a=“aaa”, b=“bbb”, то как их вписать в re.sub(b“aaa”,b“bbb”,data)?
re.sub(b a, b b, data) выдает синтаксическую ошибку.
P.S. Питон 3.3

Отредактировано dnstuff (Ноя. 6, 2012 11:44:02)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version