我使用lzw模块压缩一些数据,然后将它们保存到文件中('wb'模式)。这将返回如下内容:
'\ X18 \ XC0 \ 86#\ X08 $ \ x0e \ X060 \ X82 \ xc2` \ X90 \ x98l *'
对于小的压缩数据,lzw的字符串采用上述格式。 当我把更大的字符串用于压缩时,lzw的压缩字符串被分割成行。
'\ x18 \ xc0 \ x86#\ x08 $ \ x0e \ x060 \ x82 \ xc2` \ x90 \ x98l *','\ xff \ xb6 \ xd9 \ xe8r4'
正如我检查的那样,字符串中包含'\ n'字符,所以如果缺少新行,我想我会丢失信息。如何存储字符串以便它不会被分割并存储到一行?
我试过这个:
for i in s_string:
testfile.write(i)
-----------------
testfile.write(s_string)
修改
def mycpsr(x):
#x = '11010101001010101010010111110101010101001010' # some random bits for lzw input
temp = lzw.compress(x)
temp = "".join(temp)
return temp
>>> import lzw
>>> print mycpsr('10101010011111111111111111111111100000000000111111')
如果我输入更大的输入,则假设x是0和1以及len(x)= 1000的sting,我将压缩数据附加到文件中,我得到多行而不是1行。
如果文件包含以下数据:
'\t' + normal strings + '\n'
<LZW-strings(with \t\n chars)>
'\t' + normal strings + '\n'
我如何定义哪个是lzw,哪个是其他数据?
答案 0 :(得分:1)
您正在处理二进制数据。如果您的数据包含超过256个字节,则很可能某些字节对应于'\ n'的ascii代码。如果将其视为文本文件,这将导致二进制文件包含多行。
只要您将二进制文件作为字节序列处理而不是作为一系列行处理,这不是问题。
答案 1 :(得分:1)
因此,您的二进制数据包含换行符,并且您希望将其嵌入到面向行的文档中。为此,您需要在二进制数据中引用换行符。一种方法,不仅引用换行符,而且引用其他不可打印的字符,使用base64编码:
import base64, lzw
def my_compress(x):
# returns a single line, one trailing \n included
return base64.encodestring("".join(lzw.compress(x)))
def my_decompress(line):
return lzw.decompress(base64.decodestring(line))
如果您的代码处理换行符以外的二进制字符,则只需将换行符替换为r"\n"
(反斜杠后跟n
),并使用{{1}替换反斜杠,即可使编码更节省空间(两个反斜杠字符)。这将允许lzw数据驻留在单个二进制行中,您需要在调用r"\\"
之前执行逆转换。
答案 2 :(得分:0)
>>> txt = """Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum
ante velit, adipiscing eget sodales non, faucibus vitae nunc. Praesent ac lorem
cursus, aliquet magna sed, porta diam. Nunc lorem sapien, euismod in congue non
, tincidunt sit amet arcu. Lorem ipsum dolor sit amet, consectetur adipiscing el
it. Phasellus eleifend bibendum massa, ac convallis tellus sodales in. Suspendis
se non aliquam massa. Aenean erat ipsum, sagittis vitae elementum sit amet, iacu
lis sit amet quam. Vivamus luctus hendrerit libero at fringilla. Nullam id urna
est. Vestibulum pretium et tellus et dictum.
...
... Fusce nulla velit, lobortis at ligula eget, fermentum condimentum felis. Mae
cenas pretium posuere elit in posuere. Suspendisse gravida erat tristique, venen
atis erat at, sagittis elit. Donec laoreet lacinia nunc, eu consequat tortor. Cr
as at sem scelerisque, tristique dolor a, porta mauris. Fusce fermentum massa vi
tae arcu sagittis, et laoreet lacus suscipit. Vestibulum sed accumsan quam. Vest
ibulum eu egestas nisl. Curabitur dolor massa, auctor tempus dui ut, volutpat vu
lputate massa. Fusce vitae tortor adipiscing, gravida est at, molestie tortor. A
enean quis magna magna. Donec cursus enim ac egestas cursus. Pellentesque pulvin
ar nibh in sapien sollicitudin, eget tempus tortor pulvinar. Phasellus dignissim
, urna a sagittis tempor, nulla nulla rhoncus enim, vel molestie nisl lectus qui
s erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sit
amet malesuada nisi, sit amet placerat sem."""
>>>
>>> print "".join(lzw.decompress(lzw.compress(txt)))
似乎正确地重新解码它,包括\n