【问题标题】:running python script for multiple files from windows cmd从 Windows cmd 为多个文件运行 python 脚本
【发布时间】:2013-12-09 13:21:56
【问题描述】:

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

您知道问题出在哪里吗? 谢谢!

【问题讨论】:

    标签: python windows batch-file cmd


    【解决方案1】:

    Unix shell 将文件路径模式转换为实际文件,然后将结果传递给程序。 (python myscript.py)

    但在 Windows cmd 中,这不会发生。

    如果您想获取与模式匹配的文件列表,请参阅glob.glob

    【讨论】:

      【解决方案2】:

      在运行您的 python 脚本之前,这些通配符会在“shell(即 bash)级别”进行扩展。 所以问题不在于python,而在于您在Windows上使用的“shell”。 可能你在云端尝试 PowerShell for Windows 或通过 CygWin 进行 bash。

      【讨论】:

        【解决方案3】:

        试试这个:

        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%
        

        【讨论】:

        • 这个有效,但我的脚本的目标是将所有 18 个文件绘制在一起,而这个分别绘制每个文件......你知道为什么吗?
        • 我添加了另一个示例。这将在 %files% 中创建一个列表,例如“filename1.txt filename11.txt”
        【解决方案4】:

        从批处理文件

        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%"
        

        【讨论】:

        • 这个也可以,但也可以单独处理每个文件,而不是像应该的那样一起处理。它应该将 18 个文件绘制成一个图,而不是将每个文件绘制成自己的图
        • @user3041107:已更新。对不起,我误会了。
        【解决方案5】:

        正如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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          • 1970-01-01
          • 1970-01-01
          • 2015-09-03
          • 1970-01-01
          • 2021-12-19
          • 2016-06-01
          相关资源
          最近更新 更多