繁体   English   中英

python写字节字符串

[英]python write strings of bytes

我使用lzw模块压缩一些数据,然后将它们保存到文件中(“ wb”模式)。 这将返回如下内容:

'\\ x18 \\ xc0 \\ x86#\\ x08 $ \\ x0e \\ x060 \\ x82 \\ xc2` \\ x90 \\ x98l *'

对于较小的压缩数据,lzw的字符串采用上述格式。 当我放置较大的字符串进行压缩时,lzw的压缩字符串会分成几行。

'\\ x18 \\ xc0 \\ x86#\\ x08 $ \\ x0e \\ x060 \\ x82 \\ xc2` \\ x90 \\ x98l *','\\ xff \\ xb6 \\ xd9 \\ xe8r4'

当我检查时,字符串包含'\\ n'字符,所以如果缺少新行,我认为我会丢失信息。 我该如何存储字符串,以便将其不分割并存储到1行中?

我已经试过了:

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,然后将压缩后的数据附加到文件中,则得到多行而不是1行。

如果文件包含以下数据:

'\t' + normal strings + '\n'
<LZW-strings(with \t\n chars)>
'\t' + normal strings + '\n'

我如何定义哪个是lzw和哪个是其他数据?

您正在处理二进制数据。 如果您的数据包含超过256个字节,则很有可能某些字节对应于'\\ n'的ASCII码。 如果将其视为文本文件,将导致二进制文件包含多行。

只要您将二进制文件作为字节序列而不是行序列来处理,这不是问题。

因此,您的二进制数据包含换行符,并且您希望将其嵌入到面向行的文档中。 为此,您需要在二进制数据中引用换行符。 一种方法是使用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 ),并将反斜杠替换为r"\\\\" (两个反斜杠字符)来使编码更加节省空间。 这将允许lzw数据驻留在单个二进制行中,并且您只需要在调用lzw.decompress之前进行逆变换lzw.decompress

>>> 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM