我正在尝试从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中的一个文件上尝试了脚本,它就可以了。
你有什么问题可以解决问题吗? 谢谢!
答案 0 :(得分:1)
Unix shell将文件路径模式转换为实际文件,然后将结果传递给程序。 (python myscript.py
)
但在Windows cmd中,这不会发生。
如果您希望获取与模式匹配的文件列表,请参阅glob.glob
。
答案 1 :(得分:0)
在运行python脚本之前,这些通配符在“shell(即bash)级别”扩展。 所以问题不在于python,而在于你在Windows上使用的“shell”。 可能你会尝试使用PowerShell for Windows或通过CygWin进行bash。
答案 2 :(得分:0)
试试这个:
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%
答案 3 :(得分:0)
来自批处理文件
for %%f in ("filename*.txt") do python myscript.py "%%~nxf"
%%f
将获得对每个文件的引用。对于他们每个人执行你的脚本。 %%~nxf
将扩展为文件的名称和扩展名。
从命令行,将%%
替换为一个%
已编辑 - 我很想念这个问题。接下来试试。
在Windows中,没有通配符参数的默认扩展(请参阅here)。因此,要获得相同的结果,您将需要一个批处理文件。它将连接文件列表并将其传递给您的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%"
答案 4 :(得分:0)
正如falsetru
注意到,在Windows上,shell不会为您扩展通配符,因此正确答案为glob.glob()
。您应该遍历所有命令行参数并展开每个参数。这在Linux / UNIX中也可以正常工作,因为没有任何通配符的参数的扩展(这是shell给你的)是未更改的文件名。所以像这样,使用惰性求值来处理潜在的大量args:
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