python做工具遇到报错:[Errno 22] invalid mode ('rb') or filename

本文详细介绍了使用Python处理Excel配置表导出Lua配置时遇到的中文编码问题,并分享了解决方案。重点在于解决读取和写入文件时的编码兼容性问题,以及在Windows开发环境中处理不同编码格式的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近工作需要,做一个策划excel配置表导出lua配置的工具,用python做的。首先就踩了python中文编码的坑,估计不少人都会遇到,encode和decode的问题:python中,str是字节串,unicode是字符串,字节串decode解码成为字符串,而字符串encode编码成为字节串,一旦用错,诸如下图的报错就会让人痛不欲生:


特别是windows开发,中文编码的问题是一个梗。要知道有些工具是utf8编码,而有些则是gbk编码,如何转换是个大难题。所幸,遇到了AstralWind的这篇文章:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 整个看完基本可以科普一下中文编码相关的基础知识。


言归正传,现在遇到的这个问题比较奇怪,报错如下:



开始以为是读写权限问题,最后发现配置表文件名最后多了个空格,o(╯□╰)o,去掉文件名的空格之后可以正常导出:

罪魁祸首就是excelData = xlrd.open_workbook(filePath)这句代码,这工具是支持所有文件导出(用os.listdir(dirPath)去搜索目录结构下所有文件)及单个文件导出(单个文件的路径是直接将文件拖到控制台中获取的,也就是该文件的绝对路径,但是会是单斜杠的路径,没有用转义),但奇怪的是,单个文件导出,文件名有空格的文件会出问题,而所有文件批量导出是没问题的。二者操作不同导致传入到xlrd.open_workbook中的路径不同,所以批量导出的时候是没问题的,而单个文件导出是有问题的。当然,为了方便起见,我也已经强烈要求策划改配置表的文件名,不允许粗线空格了……^_^

解释报错:BadGzipFile Traceback (most recent call last) Cell In[18], line 88 86 folder_list2 = [] 87 #四、选择提取模式,第四个参数则是解压全部 ---> 88 extract_gz_files(source, target, folder_list, True) Cell In[18], line 36, in extract_gz_files(source_dir, target_dir, folder_list, do_all) 34 with gzip.open(gz_path, "rb") as f_in: 35 with open(target_path, "wb") as f_out: ---> 36 shutil.copyfileobj(f_in, f_out) 37 print(f"解压成功: {filename} -> {target_path}") File ~/anaconda3/lib/python3.12/shutil.py:203, in copyfileobj(fsrc, fdst, length) 201 fsrc_read = fsrc.read 202 fdst_write = fdst.write --> 203 while buf := fsrc_read(length): 204 fdst_write(buf) File ~/anaconda3/lib/python3.12/gzip.py:324, in GzipFile.read(self, size) 322 import errno 323 raise OSError(errno.EBADF, "read() on write-only GzipFile object") --> 324 return self._buffer.read(size) File ~/anaconda3/lib/python3.12/_compression.py:68, in DecompressReader.readinto(self, b) 66 def readinto(self, b): 67 with memoryview(b) as view, view.cast("B") as byte_view: ---> 68 data = self.read(len(byte_view)) 69 byte_view[:len(data)] = data 70 return len(data) File ~/anaconda3/lib/python3.12/gzip.py:527, in _GzipReader.read(self, size) 523 if self._new_member: 524 # If the _new_member flag is set, we have to 525 # jump to the next member, if there is one. 526 self._init_read() --> 527 if not self._read_gzip_header(): 528 self._size = self._pos 529 return b"" File ~/anaconda3/lib/python3.12/gzip.py:496, in _GzipReader._read_gzip_header(self) 495 def _read_gzip_header(self): --> 496 last_mtime = _read_gzip_header(self._fp) 497 if last_mtime is None: 498 return False File ~/anaconda3/lib/python3.12/gzip.py:456, in _read_gzip_header(fp) 453 return None 455 if magic != b'\037\213': --> 456 raise BadGzipFile('Not a gzipped file (%r)' % magic) 458 (method, flag, last_mtime) = struct.unpack("<BBIxx", _read_exact(fp, 8)) 459 if method != 8: BadGzipFile: Not a gzipped file (b'%%')
最新发布
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值