Python中有两种主要的字符串类型:代表二进制数据的字节字符串(字节序列)和代表人类可读文本的Unipre字符串(Unipre代码点序列)。将一个转换为另一个(☯)很简单:
unipre_text = bytestring.depre(character_encoding)bytestring = unipre_text.enpre(character_encoding)
例如,如果您以二进制模式打开文件,
'rb'则
file.read()返回一个字节串(
bytes类型):
>>> b'A' == b'x41' == chr(0b1000001).enpre()True
可以使用几种方法对字节进行分类:
字符串方法,例如
bytes.isdigit()
:>>> b'1'.isdigit()
True
字符串常量,例如
string.printable
>>> import string
b’!’ in string.printable.enpre()
True正则表达式,例如
d
>>> import re
bool(re.match(br’d+$’, b‘123’))
Truecurses.ascii
模块中的分类功能,例如curses.ascii.isprint()
>>> from curses import ascii
bytearray(filter(ascii.isprint, b‘123’))
bytearray(b‘123’)
bytearray是一个可变的字节序列-与字节字符串不同,您可以就地更改它,例如,将第三个大写字母字节小写:
>>> import string>>> a = bytearray(b'ABCDEF_')>>> uppercase = string.ascii_uppercase.enpre()>>> a[::3] = [b | 0b0100000 if b in uppercase else b ...for b in a[::3]]>>> abytearray(b'aBCdEF_')
注意:
b'ad'是小写字母,但
b'_'保持不变。
要就地修改二进制文件,可以使用
mmap模块,例如,将每隔一行中的第4列小写
'file':
#!/usr/bin/env python3import mmapimport stringuppercase = string.ascii_uppercase.enpre()ncolumn = 3 # select 4th columnwith open('file', 'r+b') as file, mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_WRITE) as mm: while True: mm.readline() # ignore every other line pos = mm.tell() # remember current position if not mm.readline(): # EOF break if mm[pos + ncolumn] in uppercase: mm[pos + ncolumn] |= 0b0100000 # lowercase
注意:在这种情况下,Python 2和3 API有所不同。该代码使用Python 3。
输入值输出量ABCDE1FGHIJABCDEFGHI
ABCDE1FGHiJABCDEFGHi
注意:第4列在第2和4h行变为小写。
通常,如果要更改文件,请执行以下 *** 作:从文件读取,对临时文件进行修改,并在成功后将临时文件替换为原始文件:
输入值#!/usr/bin/env python3import osimport stringfrom tempfile import NamedTemporaryFilecaesar_shift = 3filename = 'file'def caesar_bytes(plaintext, shift, alphabet=string.ascii_lowercase.enpre()): shifted_alphabet = alphabet[shift:] + alphabet[:shift] return plaintext.translate(plaintext.maketrans(alphabet, shifted_alphabet))dest_dir = os.path.dirname(filename)chunksize = 1 << 15with open(filename, 'rb') as file, NamedTemporaryFile('wb', dir=dest_dir, delete=False) as tmp_file: while True: # encrypt chunk = file.read(chunksize) if not chunk: # EOF break tmp_file.write(caesar_bytes(chunk, caesar_shift))os.replace(tmp_file.name, filename)
输出量abcdefABCDEF
defghiABCDEF
要转换回输出,请设置
caesar_shift = -3。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)