Python中sys.argv[1]传入glob()返回空列表问题求助
问题原因与解决办法
这个问题我之前也碰到过,本质是shell的通配符提前展开导致的,和glob模块本身没关系。
为什么会出现这个情况?
当你在命令行执行python analysis.py *.xlsx时,你的shell(比如bash、zsh这类终端壳程序)会先拦截*.xlsx这个通配符,自己先做匹配:
- 如果当前目录下有符合
.xlsx的文件,shell会把*.xlsx直接替换成所有匹配的文件名列表,比如变成python analysis.py report1.xlsx report2.xlsx。这时候你的代码里sys.argv[1]拿到的是report1.xlsx,再用glob.glob('report1.xlsx')自然只会返回这个文件本身(如果存在),完全偏离了你想用通配符批量匹配的预期; - 如果当前目录下没有匹配的文件,有些shell(比如bash的默认设置)会把
*.xlsx原样传给Python,这时候glob才能正常工作——但这是特殊情况,不是所有shell都遵循这个逻辑。
而你手动赋值dated = '*.xlsx'时,字符串没有经过shell的预处理,直接被glob解析,所以能正常匹配到目标文件。
解决办法
有两种常用的处理方式,你可以根据需求选择:
1. 让shell不展开通配符(推荐,保持glob的原始逻辑)
在命令行输入参数时,用单引号或双引号把通配符括起来,明确告诉shell“这是一个完整的字符串,不要解析它”:
python analysis.py '*.xlsx' # 或者 python analysis.py "*.xlsx"
这样sys.argv[1]就能拿到原始的*.xlsx字符串,glob可以正常解析通配符并返回所有匹配的文件。
2. 兼容shell展开的情况(支持多参数输入)
如果你希望不管用户有没有加引号,代码都能正常工作,可以修改代码,遍历所有传入的参数(而不是只取第一个):
import sys import glob all_files = [] # 遍历命令行传入的所有参数(跳过脚本名sys.argv[0]) for pattern in sys.argv[1:]: all_files.extend(glob.glob(pattern)) print(all_files)
这种方式下:
- 如果用户加了引号,
sys.argv[1:]是通配符字符串,glob会解析并返回匹配文件; - 如果用户没加引号,
sys.argv[1:]是已经展开的文件名列表,glob会逐个确认文件存在并返回。
内容的提问来源于stack exchange,提问作者Mowgli
相关产品推荐
相关产品推荐

