簡體   English   中英

從Windows cmd運行多個文件的python腳本

[英]running python script for multiple files from windows 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中的一個文件上嘗試了該腳本,它將起作用。

您是否有問題的根源? 謝謝!

Unix shell將文件路徑模式轉換為實際文件,然后將結果傳遞給程序。 python myscript.py

但是在Windows cmd中,不會發生這種情況。

如果要獲取與模式匹配的文件列表,請參見glob.glob

在運行python腳本之前,這些通配符將在“ shell(即bash)級別”進行擴展。 因此,問題不在於python,而在於您在Windows上使用的“ shell”中。 可能您嘗試通過Windows將PowerShell運用於Windows或通過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給出的),即文件名不變。 像這樣,使用惰性求值來處理可能大量的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM