从windows cmd运行多个文件的python脚本

时间:2013-12-09 13:21:56

标签: python windows batch-file cmd

我正在尝试从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中的一个文件上尝试了脚本,它就可以了。

你有什么问题可以解决问题吗? 谢谢!

5 个答案:

答案 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