Notes|Python: 如何去除字符串多余的空格、换行符(二)


如何去除多余的空格、换行符(二)

  • 前言
  • 明文文本
    • 内存变量
    • 磁盘文本文件
  • 编码
    • 字符编码
      • URL Encoding
      • ASCII
    • 字节编码
      • Unicode
      • Base64

前言 前面写过一个关于简单去除多余空格、换行符的小抄:
Python: 如何去除字符串多余的空格、换行符。有时,掌握一些不经意间的小技巧能节省很多时间,对文档规范化和自定义样式化还是很有帮助的。文档的整理囊括许多方面的问题,比如关于它的描述包含逻辑描述和物理描述。逻辑描述是从自然语言的角度出发,以人类语言逻辑的方式加工生成,易于理解。物理描述,通常是指文档的存储格式或存储描述,字符以某种特定的方式编码保存在存储器硬件上。实际上,由于操作系统或软件等平台多元化的缘故,一种逻辑描述往往对应多种物理描述。正是这种 1:N 的关系,使得文档规范化趋向抽象复杂化。因此,需要一种居中协调的中间逻辑描述来协助文档规范。
明文文本 明文文本,或纯文本,一般来说,在文档编辑器中,表示和存储都是相同的。
内存变量 在程序中定义的字符串变量,也就是保存在内存中的字符串变量。字符串变量通过print(string)函数直观地打印显示在屏幕上。在字符串变量中,“所见即所得”——一般来说,逻辑描述和物理描述是一致的。即使出现软件平台所不理解的物理描述字符,也会把它显现出来。文档规范化也相对简单。
磁盘文本文件 【Notes|Python: 如何去除字符串多余的空格、换行符(二)】磁盘文本文件(Plain Text File)的物理描述,可能由于操作系统或编辑软件的多元化,对于一种字符逻辑描述有多个不同的解释。比如,在Ubuntu 20.04的gedit文本编辑器中,视觉上看到的换行符 ‘\n’,可能是空白的一行(An empty row),也可能是 ‘^M’ 字符。这一点也不奇怪。编辑软件只是机械地认为从另一平台上复制的字符就是它所认为的那样,即使包含了所不理解的物理描述。对于这种情况,可以根据一种通用的标准,将物理描述转换为一种中间的逻辑描述,然后再对其加工整理成易于理解的目标逻辑描述。
import iodef test(text): buffer = io.StringIO(text) text = '' line = buffer.readline() last_line_empty = False while line is not None and line != '': if len(line) < 2: # len('\n') == 1 if ascii(line) == '\\n': line = '' while '\n' in line: line = line.replace('\n', '') # Filter multiple spaces. line = line.replace(' ', '') if last_line_empty == "''" and ascii(line.strip()).replace('\\n', '').replace('\\r', '').replace('\\t', '').replace('\xa0', '') == "''": # Filter multiple empty lines. pass else: text += line last_line_empty = ascii(line.strip()).replace('\\n', '').replace('\\r', '').replace('\\t', '').replace('\xa0','') # print(f'line ({last_line_empty})=> {line} = {ascii(line)}') line = buffer.readline() # ''' # Replace multiple empty lines with only one. while '\n\n' in text: text = text.replace("\n\n", '\n') return text

编码 在逻辑描述和物理描述转换时,常常涉及到编码的问题。例如,在上面的例子中,就使用ASCII码作为中间件的逻辑描述。编码的意义是将自然语言中的字符转换为特定格式的数字描述,是介于自然语言描述与机器字节描述之间的逻辑描述。按照可读性排列从高到低依次为:自然语言 > 编码 > 字节。常见的编码方法,包含URL Encoding、ASCII、Unicode集以及Base64等等。按编码输出类型来分,可以划分为字符编码和字节编码两大类。
字符编码 URL Encoding
import urllib.parse line_break = '\n' quoted = urllib.parse.quote(line_break) print(f'URL encoding of "{line_break}": {quoted}') # '%0A' # urllib.parse.unquote(quoted) # '\n'

ASCII
ASCII是8bit的编码方法。由数字0~127代表128个基本字符的编码。如,换行符’\n’的ASCII码是 10。
ascii_break = ord(line_break) print(f'ASCII of "{line_break}": {ascii_break}') # 10 # chr(ascii_break) #'\n'

字节编码 Unicode
Unicode编码集,包含UTF-8、UTF-16、Unicode-Escape等等。
line_break = '\n' unicoded = line_break.encode() # line_break.encode('UTF-8') # b'\n' # unicoded.decode() # '\n'

Base64
import base64 base64_encoded = base64.b64encode(link_break.encode()) print(base64_encoded) # b'Cg==' # base64.b64decode(base64_encoded)

    推荐阅读