down - Python-Compress Ascii String
zlib down (2)
¡Usar la compresión no siempre reducirá la longitud de una cuerda!
Considere el siguiente código;
import zlib
import bz2
def comptest(s):
print ''original length:'', len(s)
print ''zlib compressed length:'', len(zlib.compress(s))
print ''bz2 compressed length:'', len(bz2.compress(s))
Intentemos esto en una cadena vacía;
In [15]: comptest('''')
original length: 0
zlib compressed length: 8
bz2 compressed length: 14
Entonces, zlib
produce 8 caracteres adicionales y bz2
14. Los métodos de compresión generalmente ponen un ''encabezado'' frente a los datos comprimidos para que los utilice el programa de descompresión. Este encabezado aumenta la longitud de la salida.
Probemos una sola palabra;
In [16]: comptest(''test'')
original length: 4
zlib compressed length: 12
bz2 compressed length: 40
Incluso si se restara la longitud del encabezado, la compresión no ha acortado la palabra. Eso es porque en este caso hay poco que comprimir. La mayoría de los caracteres de la cadena aparecen solo una vez. Ahora para una frase corta;
In [17]: comptest(''This is a compression test of a short sentence.'')
original length: 47
zlib compressed length: 52
bz2 compressed length: 73
De nuevo, la salida de compresión es más grande que el texto de entrada. Debido a la longitud limitada del texto, hay poca repetición, por lo que no se comprime bien.
Necesitas un bloque de texto bastante largo para que la compresión funcione realmente;
In [22]: rings = ''''''
....: Three Rings for the Elven-kings under the sky,
....: Seven for the Dwarf-lords in their halls of stone,
....: Nine for Mortal Men doomed to die,
....: One for the Dark Lord on his dark throne
....: In the Land of Mordor where the Shadows lie.
....: One Ring to rule them all, One Ring to find them,
....: One Ring to bring them all and in the darkness bind them
....: In the Land of Mordor where the Shadows lie.''''''
In [23]: comptest(rings)
original length: 410
zlib compressed length: 205
bz2 compressed length: 248
Estoy buscando una manera de comprimir una cadena basada en ascii, ¿alguna ayuda?
También necesito descomprimirlo. Intenté zlib pero sin ayuda.
¿Qué puedo hacer para comprimir la cuerda en menor longitud?
código:
def compress(request):
if request.POST:
data = request.POST.get(''input'')
if is_ascii(data):
result = zlib.compress(data)
return render_to_response(''index.html'', {''result'': result, ''input'':data}, context_instance = RequestContext(request))
else:
result = "Error, the string is not ascii-based"
return render_to_response(''index.html'', {''result'':result}, context_instance = RequestContext(request))
else:
return render_to_response(''index.html'', {}, context_instance = RequestContext(request))
Ni siquiera necesitas tus datos para ser ascii, puedes alimentar zlib con cualquier cosa
>>> import zlib
>>> a=''aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'' # + any binary data you want
>>> print zlib.compress(a)
x�KL$
�
>>>
¿Qué es lo que probablemente quieres aquí? ¿Los datos comprimidos deben ser una cadena ASCII? Estoy aquí?
Si es así, debes saber que tienes un alfabeto muy pequeño para codificar datos comprimidos => así tendrías más símbolos usados.
Por ejemplo, para codificar datos binarios en base64 (obtendrás una cadena ASCII) pero usarás ~ 30% más de espacio para eso.