解决python中出现的不可见字符问题,OSError: [Errno 22] Invalid argument: '\u202a**.csv'
今天遇到一个坑,读取文件时,在用到open函数时,始终报OSError: [Errno 22] Invalid argument:的错误,意思说文件路径错误。
pandas读取csv文件时,pandas自带open()运行报错误OSError: [Errno 22] Invalid argument: '\u202a**.csv。
import pandas as pd
import os
csvfilename = r'F:\N49-N1120190525.csv'
basename=os.path.basename(csvfilename)
filenamex = os.path.splitext(basename)[0]
df = pd.read_csv(csvfilename, encoding = 'gbk')
报错提示pandas中open()打开指定文件路径时,文件路径不正确:
OSError: [Errno 22] Invalid argument:'\u202aF:\N49-N1120190525.csv'
在写代码的时候,有一段需要导入文件名,于是,就在文件属性->安全->对象名称处复制了。如果你是直接copy如下图的路径,可能就会遇到诸如u202a的windows不可见控制字符的巨坑。

百度经验:像pyCharm、Spyder等平台,不能直接复制粘贴路径不然就会报和我一样的错
很多人建议:老老实实自己打一遍路径,不要在属性里面直接复制路径就行了。
但是这方法也太不符合程序员们的作风了!
下面介绍不可见字符和解决方法。
控制字符详细可参见:博主小盼你最萌哒的\u202a 神奇的控制字符:\u202a 神奇的控制字符
下面摘抄一些控制字符介绍:
可以看到在C前面有个Unicode编码为202A的字符。

然后搜索202A Unicode
,找到这么个网站:
- 从左至右嵌入 表情符号 (U+202A) - Unicode®字符百科
就是这么个字符在作怪。
网上找了些相关资料:
.
所以这个符号应该是windows在做文件名显示的时候,为了保证文件路径是从左往右显示所加的强制字符。
引入a = a.strip(’\u202a’)即可去除。
import pandas as pd
import os
csvfilename = r'F:\N49-N1120190525.csv'
csvfilename = csvfilename.strip('\u202a')
basename=os.path.basename(csvfilename)
filenamex = os.path.splitext(basename)[0]
df = pd.read_csv(csvfilename, encoding = 'gbk')
程序可正常读取了。
报错:Traceback (most recent call last):
File “C:\Users\Irain\Desktop\k近邻(knn)算法.py”, line 23, in
im = Image.open(“C:/Users/Irain/Desktop/1.png”.
原因如下:
1-因为在python中\t为换行符如果直接复制黏贴会导致无法识别。
2-平台的bug,像pycharm,Spyder等,复制黏贴路径都会报错“OSError: [Errno 22] Invalid argument: '\u202a。。。
解决方法:
手动写入路径
某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:
# coding=gbk
import codecs
data = open("Test.txt").read()
if data[:3] ==