如何更改文件中的字节?

如何更改文件中的字节?,第1张

如何更改文件中的字节

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’))
    True

  • curses.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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5674576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存