Python读取文本文件遇异常换行字符,如何识别?
识别并处理异常换行字符的方法
遇到这种闭源程序生成的文件出现异常换行的问题,核心是先把隐藏的异常字符可视化,才能针对性解决。我之前也碰到过类似情况,很多闭源程序会用非标准控制字符当分隔符,PyCharm会把这些字符解析成换行,导致输出混乱。下面是几个实用的识别方法:
1. 打印每个字符的原始编码(最直观)
用二进制模式打开文件,直接遍历每个字节,输出它的ASCII/Unicode编码和字符本身,能精准定位异常字符:
with open("domain.com/alive_domains.txt", "rb") as f: content = f.read() for idx, byte in enumerate(content): char = chr(byte) # 显示位置、字符、ASCII码和Unicode编码 print(f"位置 {idx}: 字符 '{char}' (ASCII: {byte}, Unicode: U+{byte:04X})")
比如如果看到ASCII: 11(对应垂直制表符\x0b)或者ASCII:12(换页符\x0c),这些就是导致异常换行的元凶——PyCharm会把它们渲染成换行。
2. 用repr()显示转义后的字符串
repr()会把所有非可打印字符转成Python转义序列,一眼就能看到异常字符:
with open("domain.com/alive_domains.txt") as f: for line in f: print(repr(line))
正常的换行应该显示为'\n'或'\r\n',如果出现'\x0b'、'\x0c'甚至'\u2028'(Unicode行分隔符),这些就是你要找的异常字符。
3. 查看文件的十六进制 Dump
用binascii模块输出文件的十六进制内容,能精确看到每个字节的数值:
import binascii with open("domain.com/alive_domains.txt", "rb") as f: content = f.read() # 按每16字节分组显示,方便阅读 hex_dump = binascii.hexlify(content).decode('utf-8') for i in range(0, len(hex_dump), 32): print(hex_dump[i:i+32])
正常换行的十六进制是0a(LF)或0d0a(CR+LF),如果出现0b、0c或者e280a8(对应Unicode行分隔符U+2028),这些就是异常字符。
为什么你之前的正则没用?
你的正则[^a-z0-9/.:]+只排除了指定的字符集,但异常换行的控制字符(比如\x0b、\x0c)或者Unicode分隔符并不在这个集合里,所以无法被匹配和替换。
快速修复示例
如果识别到是垂直制表符\x0b导致的异常换行,直接替换成正常换行即可:
# 二进制模式读写,避免编码问题 with open("domain.com/alive_domains.txt", "rb") as f: fixed_content = f.read().replace(b'\x0b', b'\n') with open("fixed_alive_domains.txt", "wb") as f: f.write(fixed_content)
内容的提问来源于stack exchange,提问作者leak
相关产品推荐
相关产品推荐

