Python读取文件行后输出出现前缀b',是readlines导致还是cherrypy.log的问题?
Python读取文件行后输出出现前缀b',是readlines导致还是cherrypy.log的问题?
嗨Frank,这个问题其实很好解释,咱们一步步来拆解:
首先,这个b'...'并不是实际加到行内容里的字符,它是Python对字节字符串(bytes类型)的字面量表示方式——就像普通字符串用'...'包裹一样,字节串会用b'...'来标记它的类型。
那为什么会出现这个情况呢?根源不在readlines(),也不是cherrypy.log()的“锅”,而是你打开文件的方式:
- 如果你是用二进制模式打开文件的(比如
open('your_file.txt', 'rb')),那readlines()返回的每一行都是bytes类型的对象,而不是普通的字符串(str)。 - 当
cherrypy.log()输出这个bytes对象时,它会使用Python的repr()函数来生成可打印的表示形式,这就会带上b'前缀和对应的引号。
你可以自己验证一下:在代码里单独加一行print(line),会发现终端直接打印bytes对象时,会输出内容而不带b';但如果用print(repr(line)),就会看到b'...'的格式——cherrypy.log应该就是用了类似repr()的逻辑来记录日志内容。
解决办法也很直接:
- 用文本模式打开文件:把打开方式改成文本模式(
'r',默认就是这个),同时指定正确的编码(比如UTF-8):
这样with open('your_file.txt', 'r', encoding='utf-8') as f: lines = f.readlines()readlines()返回的就是普通的字符串,日志里就不会有b'前缀了。 - 如果已经拿到bytes对象,转成字符串:如果因为某些原因必须用二进制模式打开,那在输出前把字节串解码成字符串:
注意要和文件实际的编码匹配,避免出现乱码问题。cherrypy.log('line%s: %s' % (wpnum, line.decode('utf-8')))
另外,你看到的\r\n是Windows风格的换行符,文本模式打开时Python会自动帮你转换成\n,二进制模式则会保留原始的换行符,这也是区分两种打开模式的小细节~
备注:内容来源于stack exchange,提问作者user3765883
相关产品推荐
相关产品推荐

