示例1
读取同样一个文件binary_read_1.txt。
春眠不觉晓,处处闻啼鸟。
夜来风雨声,花落知多少。
其中该文件内容被下段代码读出(注意,这里是采用的readlines)
f = open("binary_output_1.txt", 'rb') b = f.readlines() #b 绑定资源句柄 字节串 if type(b) == str: print("b是字符串") elif type(b) == bytes: print("b是字节串") else: print("b是其它类型") print(b) f.close()
运行结果:
b是其它类型 [b'\xe6\x98\xa5\xe7\x9c\xa0\xe4\xb8\x8d \xe8\xa7\x89\xe6\x99\x93\xef\xbc\x8c\xe5 \xa4\x84\xe5\xa4\x84\xe9\x97\xbb\xe5\x95 \xbc\xe9\xb8\x9f\xe3\x80\x82\n', b'\xe5\xa4 \x9c\xe6\x9d\xa5\xe9\xa3\x8e\xe9\x9b\xa8 \xe5\xa3\xb0\xef\xbc\x8c\xe8\x8a\xb1\xe8 \x90\xbd\xe7\x9f\xa5\xe5\xa4\x9a\xe5\xb0 \x91\xe3\x80\x82\n']
运行结果是每段开始以b‘’包含字符串,形成字节串。原文件换行处以\n结尾。
如果该文件被下段代码读取(注意,这里是采用的readline)
f = open("binary_output_1.txt", 'rb') b = f.readline() #b 绑定资源句柄 字节串 if type(b) == str: print("b是字符串") elif type(b) == bytes: print("b是字节串") else: print("b是其它类型") print(b) f.close()
运行结果
b是字节串 b'\xe6\x98\xa5\xe7\x9c\xa0\xe4\xb8\x8d \xe8\xa7\x89\xe6\x99\x93\xef\xbc\x8c\xe5 \xa4\x84\xe5\xa4\x84\xe9\x97\xbb\xe5\x95 \xbc\xe9\xb8\x9f\xe3\x80\x82\n'
对比两个代码的运行结果:
readlines()显示的为非字节串,而readline()显示的为字节串,实际内容一致。
示例2
读取同样一个文件binary_read_2.txt。
1 ABCDEFabcdef012345 2 3
用下段代码读取
f = open("binary_output_2.txt", 'rb') b = f.readlines() #b 绑定资源句柄 字节串 if type(b) == str: print("b是字符串") elif type(b) == bytes: print("b是字节串") else: print("b是其它类型") print(b) f.close()
运行结果:
b是其它类型 [b'ABCDEFabcdef012345\n', b'\n']
若采用readline()读取
f = open("binary_output_2.txt", 'rb') b = f.readline() #b 绑定资源句柄 字节串 if type(b) == str: print("b是字符串") elif type(b) == bytes: print("b是字节串") else: print("b是其它类型") print(b) f.close()
运行结果
b是字节串 b'ABCDEFabcdef012345\n'
为什么readline()读取时为字节串,readlines()读取时为其他类型呢?
因为当readline()读取时,将原文件行内容进行了转换,以b''形式将其转变成字节串形式;
当readlines()读取信息时,以换行符为结尾形成字节串,同时将字节串为元素组成列表,所以为其他形式
为什么应为字母和数字在转换字节串时直接输出,而汉字则时不能直接显示?
在字节串bytes中,当字节值超出ASCII字符范围内时,会以\x##形式显示字节流,其中三个\x##形式代表一个汉字
例如
>>> b'\xe6\x98\xa5'.decode('utf-8',errors="ignore") '春'
详细信息可以参考廖雪峰博客的python-字符串和编码部分