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