使用bash/xlsx2csv转XLS为CSV:本地正常线上报IndexError
解决xlsx2csv在生产服务器执行时出现IndexError的问题
问题背景
我写了一段bash脚本,用来批量把指定目录下的XLSX文件转成CSV格式,本地跑起来完全没问题,但放到生产服务器上执行时,直接抛出了IndexError: list index out of range的错误。
我的bash脚本代码如下:
#!/bin/bash FILES=public/uploads/imports/*.xlsx for f in $FILES do filename=$(basename "$f" .xlsx) outext=".csv" file="public/uploads/imports/"$filename$outext echo "Processing $file file..." xlsx2csv "$f" > "${file%.}" done mv public/uploads/imports/*.xlsx public/uploads/imports/processed echo "Moved Files to Processed Folder"
报错信息如下:
Processing public/uploads/imports/fbb8099038b2f56269fe301e927e7685.csv file... Traceback (most recent call last): File "/usr/bin/xlsx2csv", line 5, in <module> pkg_resources.run_script('xlsx2csv==0.7.6', 'xlsx2csv') File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 540, in run_script self.require(requires)[0].run_script(script_name, ns) File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 1462, in run_script exec_(script_code, namespace, namespace) File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 41, in exec_ exec("""exec code in globs, locs""") File "<string>", line 1, in <module> File "/usr/lib/python2.7/site-packages/xlsx2csv-0.7.6-py2.7.egg/EGG-INFO/scripts/xlsx2csv", line 1124, in <module> File "/usr/lib/python2.7/site-packages/xlsx2csv-0.7.6-py2.7.egg/EGG-INFO/scripts/xlsx2csv", line 198, in __init__ IndexError: list index out of range
可能的原因分析
这个错误大概率和以下几个因素有关:
- 文件格式问题:生产服务器上的XLSX文件可能损坏、用了非标准格式(比如某些旧Excel版本生成的文件、带空白工作表);
- 版本兼容性:本地和生产服务器的xlsx2csv版本不一致,你用的0.7.6是比较旧的版本,对新格式支持差;
- Python环境差异:本地用的是Python3,而生产服务器还在维护停止的Python2.7,两者对文件解析的细节处理有区别。
解决方案
方案1:先排查单个文件是否有问题
先手动在生产服务器上转换报错的那个文件,确认是不是文件本身的问题:
xlsx2csv public/uploads/imports/fbb8099038b2f56269fe301e927e7685.xlsx test.csv
如果单个文件也报错,试试用Excel打开这个文件后重新保存为标准XLSX格式,或者删除里面的空白工作表再重试。
方案2:升级xlsx2csv版本
0.7.6版本太老了,对很多新格式支持不足,直接升级到最新版本:
# 生产环境是Python2.7的话用pip2 pip2 install --upgrade xlsx2csv # 如果有Python3环境,优先用pip3安装 pip3 install --upgrade xlsx2csv
升级完成后再跑脚本,大概率能解决兼容性问题。
方案3:切换到Python3环境执行
Python2.7已经停止维护,xlsx2csv的新版本对Python3支持更好。如果生产服务器有Python3,修改脚本里的调用方式:
# 把原来的xlsx2csv "$f" > "${file%.}"改成下面这行 python3 -m xlsx2csv "$f" > "${file%.}"
方案4:给脚本加错误处理,避免批量执行中断
可以在脚本里加个判断,如果单个文件转换失败,就跳过它继续处理其他文件,不会因为一个坏文件导致整个脚本挂掉:
#!/bin/bash FILES=public/uploads/imports/*.xlsx for f in $FILES do filename=$(basename "$f" .xlsx) outext=".csv" file="public/uploads/imports/"$filename$outext echo "Processing $file file..." # 执行转换并检查返回值 xlsx2csv "$f" > "${file%.}" if [ $? -ne 0 ]; then echo "Error processing $f, skipping..." continue fi done mv public/uploads/imports/*.xlsx public/uploads/imports/processed echo "Moved Files to Processed Folder"
总结
优先排查文件本身的问题,然后尝试升级xlsx2csv或者切换到Python3环境,再配合脚本的错误处理,基本就能解决生产环境的报错问题了。
内容的提问来源于stack exchange,提问作者anthivity
相关产品推荐
相关产品推荐

