我想从Windows CMD运行python脚本。 当我在linux下运行它时,
python myscript.py filename??.txt
它通过从filename01.txt到filename18.txt的数字文件,它的工作原理。
我试图从cmd运行它
python myscript.py filename*.txt
要么
python myscript.py filename**.txt
但它没有工作。 如果我在Windows cmd中的单个文件上尝试脚本,它的作品。
你有什么线索可以解决问题吗? 谢谢!
Unix shell将文件路径模式转换为实际文件,然后将结果传递给程序。 ( python myscript.py
)
但是在Windows cmd中,这不会发生。
如果你想获得匹配模式的文件列表,请参阅glob.glob
。
这些通配符在运行python脚本之前在“shell(即bash)级别”进行扩展。 所以这个问题不在Python中,而是在Windows上使用的“shell”中。 也许你云试用Windows的PowerShell或通过CygWin bash。
尝试这个:
FOR %X IN (filename*.txt) DO (python myscript.py %X)
编辑 ,你可以创建一个.bat这个,并尝试它。
setlocal EnableDelayedExpansion set files= FOR %%X IN (filename*.txt) DO set files=!files! %%X echo %files% python myscript.py %files%
从批处理文件
for %%f in ("filename*.txt") do python myscript.py "%%~nxf"
%%f
将得到每个文件的引用。 为他们每个人执行你的脚本。 %%~nxf
将扩展到文件的名称和扩展名。
从命令行将%%
替换为单个%
编辑 – 我误解了这个问题。 下一次尝试。
在Windows中,没有通配符参数的默认扩展(请参见此处 )。 所以,要得到相同的结果,你需要一个批处理文件。 它将连接文件列表并将其传递给您的Python脚本
@echo off setlocal enabledelayedexpansion set "fileList=" for %%f in ("*.txt") do set "fileList=!fileList! "%%f"" python myscript.py !fileList! endlocal
对于一个更可重用的代码,使用一些东西(脚本调用只回显屏幕显示参数的效果,并避免不必要的执行,当它按预期工作时删除)
@echo off setlocal enableextensions call :glob "*.txt" true fileList echo python myscript.py %fileList% echo. call :glob "*.txt" false fileList echo python myscript.py %fileList% exit /b :glob pattern useFullPath outputList setlocal enabledelayedexpansion if /i "%~2"=="true" (set "_name=%%%%~ff") else (set "_name=%%%%~nxf") set "_list=" for %%f in ("%~1") do set "_list=!_list! "%_name%"" endlocal & if not "%~3"=="" set "%~3=%_list%"
作为falsetru
笔记,在Windows上shell不会为您扩展通配符,所以正确的答案是glob.glob()
。 你应该迭代所有的命令行参数并展开每个参数。 这在Linux / UNIX中也可以正常工作,因为没有任何通配符的参数(这是shell给你的)的扩展是没有改变的文件名。 所以像这样,使用懒惰评估来处理潜在的大量的参数:
from sys import argv from glob import glob from itertools import chain, islice for name in chain.from_iterable(glob(name) for name in islice(argv, 1, None)): # do something with each file