Найти - Пользователи
Полная версия: Запись произвольных данных
Начало » Python для новичков » Запись произвольных данных
1
xtesterx
Приветствую, подскажите пожалуйста, как можно писать в файл различного рода “сырые” данные без учёта автоматических преобразований кодировок, например, у меня есть некая строка, я просто хочу записать её в файл без каких-либо дополнительных преобразований, то есть просто некий поток произвольных данных.
Допустим, согласно этому примеру
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
doza_and
Для этого у вас должны в data быть сырые данные а не unicode.

#!/usr/bin/env python
# -*- coding: cp1251 -*-
a=u“hello приветик”
with open(“a.dat”,“wb”) as f:
f.write(buffer(a))
xtesterx
ясно, спасибо, то есть ф-ция buffer создаёт “буфер” из любого объекта, поддерживающего buffer call interface - я правильно понимаю?
Не могли бы уточнить, как работает эта функция в случае большого объёма исходных данных (например, строка содержит скажем 32МБ), ф-ция buffer создаст её копию, или будет работать со строкой, как с неким генератором, и брать некоторую часть от размера ? если да (будет брать некоторую часть), то можно ли как-то его задавать самостоятельно (то есть собственно, задавать размер этого промежуточного буфера) ?
xtesterx
в общем, сделал как-то так:
offset, size = 0, 1024

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

f.close()
если есть более правильный вариант записи больших “сырых” данных без перерасхода памяти (то есть, через промежуточный небольшой буфер), будет интересно посмотреть, спасибо!
doza_and
1. Мне кажется вы зря заморачиваетесь, работа с буфером это почти
char buffer[32*M];
f=fopen(...);
fwrtie(buffer,32*M);
Буферизация будет на уровне ОС. Или вы посмотрели и там есть проблемы?
2 Размер вашего буфера маловат, обычно бывает не менее 4k.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB