Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 20, 2011 22:23:49

xtesterx
От:
Зарегистрирован: 2011-10-20
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись произвольных данных

Приветствую, подскажите пожалуйста, как можно писать в файл различного рода “сырые” данные без учёта автоматических преобразований кодировок, например, у меня есть некая строка, я просто хочу записать её в файл без каких-либо дополнительных преобразований, то есть просто некий поток произвольных данных.
Допустим, согласно этому примеру

f = open("somedate.html", "wb")
f.write(data)
f.close()
я просто хочу записать в файл somedate.html неважно что и в какой кодировке значение переменной data (и мне совершенно не нужно знать, какая там кодировка и вообще, ASCII символы или что-то другое, просто “бинарный” поток данных), однако, питон пытается что-то преобразовывать, и вылетает с ошибкой: UnicodeEncodeError: ‘ascii’ codec can't encode character u'\u2014' in position 184: ordinal not in range(128)
но в данном случае, мне вообще ничего не нужно преобразовывать, просто скинуть в файл значение этой переменной как есть, то есть, что-то в роди file_put_contents из PHP



Офлайн

#2 Окт. 20, 2011 22:38:25

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запись произвольных данных

Для этого у вас должны в data быть сырые данные а не unicode.

#!/usr/bin/env python
# -*- coding: cp1251 -*-
a=u“hello приветик”
with open(“a.dat”,“wb”) as f:
f.write(buffer(a))



Офлайн

#3 Окт. 20, 2011 22:55:04

xtesterx
От:
Зарегистрирован: 2011-10-20
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись произвольных данных

ясно, спасибо, то есть ф-ция buffer создаёт “буфер” из любого объекта, поддерживающего buffer call interface - я правильно понимаю?
Не могли бы уточнить, как работает эта функция в случае большого объёма исходных данных (например, строка содержит скажем 32МБ), ф-ция buffer создаст её копию, или будет работать со строкой, как с неким генератором, и брать некоторую часть от размера ? если да (будет брать некоторую часть), то можно ли как-то его задавать самостоятельно (то есть собственно, задавать размер этого промежуточного буфера) ?



Офлайн

#4 Окт. 20, 2011 23:28:13

xtesterx
От:
Зарегистрирован: 2011-10-20
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись произвольных данных

в общем, сделал как-то так:

offset, size = 0, 1024

while True:
buf = buffer(data, offset, size)
if (not buf):
break
f.write(buf)
offset += size - 1

f.close()
если есть более правильный вариант записи больших “сырых” данных без перерасхода памяти (то есть, через промежуточный небольшой буфер), будет интересно посмотреть, спасибо!



Офлайн

#5 Окт. 21, 2011 07:46:19

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запись произвольных данных

1. Мне кажется вы зря заморачиваетесь, работа с буфером это почти

char buffer[32*M];
f=fopen(...);
fwrtie(buffer,32*M);
Буферизация будет на уровне ОС. Или вы посмотрели и там есть проблемы?
2 Размер вашего буфера маловат, обычно бывает не менее 4k.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version