Python读取含\u202f的tsv文件打印时字符消失是什么原因
问题现象
读取含Unicode特殊字符\u202f(窄不间断空格)的tsv文件时,不同打印方式出现展示差异:
- 测试代码:
ff = "test.tsv" lines1 = open(ff, encoding='utf-8').readlines() str1 = open(ff, encoding='utf-8').read() print("lines1:", lines1) print("lines1[0]:", lines1[0]) print("str1:", str1)
- 对应运行输出:
lines1: ['assume Fourbooks\u202f è una piattaforma\n'] lines1[0]: assume Fourbooks è una piattaforma str1: assume Fourbooks è una piattaforma
直接打印readlines()返回的列表时能看到\u202f转义符,但打印列表内单个元素、read()返回的完整字符串时,该字符看起来像消失了。
产生原因
这个差异和Python打印不同类型对象的底层逻辑有关,\u202f字符从始至终都存在于读取到的内容里,根本没有消失:
- 打印列表等容器对象时,Python会调用容器的
__repr__()方法生成输出,该方法会对容器内的所有字符串元素统一调用repr()做转义处理:特殊空白、不可见的Unicode字符会被展示为\uXXXX格式的转义序列,因此你能在列表输出中直接看到\u202f的转义写法。 - 打印单个字符串对象时,Python调用的是字符串的
__str__()方法,该方法会直接渲染字符串内的所有Unicode字符,不会做转义处理。\u202f本身是宽度极窄的不间断空白字符,视觉上和普通空格高度相似,肉眼很难直接分辨,因此会产生“字符消失”的错觉。
验证方法
可以通过如下代码确认字符始终存在于字符串中:
# 判断字符是否存在 print('\u202f' in lines1[0]) # 会返回布尔值True # 对单个字符串调用repr,即可看到和列表输出一致的转义效果 print(repr(lines1[0]))
内容的提问来源于stack exchange,提问作者WhatIsMyName
相关产品推荐
相关产品推荐

