出现Python OSError: [Errno 22] Invalid argument的来龙去脉

参考解决办法:https://blog.csdn.net/weixin_44952395/article/details/105289460

问题描述:

今天我在读取文本文档txt内的文件路劲时总是报错,如下图所示


上网找了好几种解决办法,其中我在本文开头所述的参考办法比较有用。

发表该文章的主要目的是想说一下我遇到问题的来龙去脉,希望有遇到该类型问题的伙伴们,可以少走些弯路。

问题产生的原因:

首先介绍一下我的电脑环境:
win7系统
python3.7的运行环境(估计python3.0以上的都行)
Excel2013
WPS2021(11.1.0.11294)版本还是挺新的

我有100多张相同格式Excel表格,我想将这些表格合并成一张表格进行数据分析。

(为了节约时间,本段可以跳至一段)或许有小伙伴问了,为啥不直接使用wps工具合并或者使用Excel自带的表格批量合并功能,一是因为俺穷,没有钱开会员;二是电脑安装的WPS版本和Excel版本比较低,我上网找到的可以使用自带多表格合并功能的Excel版本都比我的版本要高,合并个表格,我就得重装Excel是不是有点多余啊(主要的原因还是太懒了,不想换Excel),被逼的走投无路,选择使用python自己写代码合并,当然也可以使用VB写个宏进行合并,奈何自己不会VB,哎~,有空也学一下。

言归正传,我的思路是:
1.将所有的Excel路径存储在txt文本文档内
2.For循环读取文本文档内的Excel路径
3.读取每个Excel路径内的各个表单sheet
4.使用pd.concat()函数即可合并表格
5.保存文件

由于我的电脑是windows7系统,电脑版本比较老了,Win7系统创建的txt文本文档时,默认的编码方式是ANSI。我创建好txt后,直接将遍历的Excel路径保存到里面了。结果在我在读取txt的文本路径时,直接报错UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xd0 in position 11: invalid continuation byte,如下图所示

这种问题可难不倒我,我就将保存Excel路径的txt另存为新的txt,并将编码方式改为UTF-8(当然Win10系统默认创建的txt的编码方式是UTF-8,无需修改)。
结果就出现文章标题的问题了,可以使用print()函数打印出第一条路径来,但是使用pd.read_excel()函数时,直接报错。接下来我们分析一下错误的原因


原因分析及解决办法:

 D:\ProgramData\Anaconda3\lib\site-packages\xlrd\__init__.py in open_workbook(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows)
    114         peek = file_contents[:peeksz]
    115     else:
--> 116         with open(filename, "rb") as f:
    117             peek = f.read(peeksz)
    118     if peek == b"PK\x03\x04": # a ZIP file

OSError: [Errno 22] Invalid argument: '\ufeffD:\\Desktop\\新建文件夹\\测试数据 - 副本 - 副本 (2).xlsx\n'

仔细观察OSError: [Errno 22] Invalid argument错误不难发现,在后面的路径莫名其妙的多出来几个字符
“\ufeff” 和 “\n”。既然多出来这几个字符,那我直接删掉不就可以,于是,我直接使用replace()函数直接替换掉,也可以使用其他方法(txt文本文档默认会在换行时,自动添加一个换行符‘\n’,平时我们在使用时看不到,其实被隐藏,当你使用NotePad++ 查看时候会显示很多隐藏的字符)。
代码前后修改对比

修改前:
#第一步:调用pandas包
import pandas as pd
#第二步:读取数据
#1.将多个Excel的路径放在TXT文本内,读取txt文本内的路径
#设置txt文本的路径
src=r"D:\Desktop\新建文件夹\src2.txt"
with open(src) as f:
    for excelpath in f.readlines():
        print (excelpath)        
        iris = pd.read_excel(excelpath,None)#读入数据文件
        

修改后:
#第一步:调用pandas包
import pandas as pd
#第二步:读取数据
#1.将多个Excel的路径放在TXT文本内,读取txt文本内的路径
#设置txt文本的路径
src=r"D:\Desktop\新建文件夹\src2.txt"
with open(src) as f:
    for excelpath in f.readlines():
        print (excelpath)  
        excelpath=xlspath.strip() #删除多余的换行符 ‘\n’
        excelpath=xlspath.replace("\ufeff","")  #删除隐藏的字符\ufeff              
        iris = pd.read_excel(excelpath,None)#读入数据文件

问题完美解决,Nice,感谢博主Overload310 分享的解决办法OSError: [Errno 22] Invalid argument问题解决

我还有个疑问,那么产生这个问题的原因究竟是什么?
这次我直接创建一个txt文本文档,不过这次我直接将编码方式改为UTF-8,还会出现上述问题吗?
于是乎,我就将我的txt内的文本内容复制到Win10系统上,重新创建txt,直接保存(前面说过win10的编码方式),然后在拷到我的电脑上,结果显而易见,‘\ufeff’字符没有了。
我又测试了一下,我使用notepad++,直接使用UTF-8编码方式创建txt,果然不存在‘\ufeff’字符了
这就证明我的猜想,小结一下。


小结:

通过以上的测试,小结如下: 出现Python OSError: [Errno 22] Invalid argument的问题, 1.说明文件路径存在问题(文件路径不存在,字符串与文件路径不一致) 2.当路径前面出现比较奇怪的字符时(如‘\ufeff’,‘\u202a’ 等,注意不一定完全一样),就应该想到是由于编码原因造成的(到底是ANSI编码还是UTF-8编码,还是其他编码原因) 3.当以这些奇怪的字符开头时候,可以直接删除,不影响路径,需要仔细辨别。

具体的编码方式,我就不再这详细赘述了(主要是我也是略知一二)。

至此该问题已解决,希望对各位有所帮助。你们的点赞就是对小编的最大的支持,感谢!!

来源:激动的兔子

物联沃分享整理
物联沃-IOTWORD物联网 » 出现Python OSError: [Errno 22] Invalid argument的来龙去脉

发表评论