【问题标题】:run python script in every file in a directory through command line通过命令行在目录中的每个文件中运行python脚本
【发布时间】:2015-09-02 22:44:30
【问题描述】:

我有一个 python 脚本,它将文件名作为命令参数并处理该文件。但是,我有数千个文件需要处理,我想在每个文件上运行脚本,而不必每次都添加文件名作为参数。

例如: process.py file1 会做我想做的事

但是,我想在包含数千个文件(file1、file2、file3 等)的文件夹上运行 process.py

我发现它可以简单地在 Bash 中完成

for f in *; do python myscript.py $f; done

但是,我在 Windows 上,不想安装 Cygwin 之类的东西。 Windows 命令行的一段代码会是什么样子,可以模拟上面的 Bash 代码完成的工作?

【问题讨论】:

  • 您想要一个纯 Python 的解决方案(即在您的 Python 脚本中完成)还是利用 Windows 批处理功能的解决方案?
  • 顺便说一句,在 bash 中最好使用python myscript.py "$f",否则文件名中有空格会中断。
  • 我对任何一种方式都有效的解决方案持开放态度。理想情况下,它将在 python 脚本中完成,然后我可以在运行 python 脚本时传递文件夹位置的参数以进行处理。但是,如果使用 Windows 批处理更容易完成,那很好

标签: python windows batch-file windows-shell


【解决方案1】:
for %%f in (*.py) do (
    start %%f
)

我认为这行得通——我现在手边没有 Windows 盒子可以尝试一下

How to loop through files matching wildcard in batch file

该链接可能会有所帮助

【讨论】:

    【解决方案2】:
    import os, subprocess
    for f in os.listdir('.'):
        if os.path.isfile(f):
            subprocess.call(["python", "myscript.py", f])
    

    只要 Python 可执行文件位于 PATH 中,此解决方案将适用于所有平台。

    另外,如果你想递归处理嵌套子目录中的文件,你可以使用os.walk()而不是os.listdir()+os.path.isfile()

    【讨论】:

      【解决方案3】:

      既然你有python,为什么不用它呢?

      import subprocess
      import glob
      import sys
      import os.path
      
      for fname in glob.iglob(os.path.join('some-directory-name','*')):
          proc = subprocess.Popen([sys.executable, 'myscript.py', fname])
          proc.wait()
      

      更重要的是,它的便携性。

      【讨论】:

      • 这看起来不错,但对我不起作用。我用对包含文件的文件夹的绝对引用替换了“some-directory-name”,用对我要运行的脚本的绝对引用替换了“myscript.py”。但是,当我运行代码时,它似乎冻结并减慢了我的计算机速度,而没有给我它应该的输出。我错过了什么吗?我正在尝试在 iPython QTConsole 中运行代码
      • 听起来好像在工作!如果您有数千个文件,那么您将获得数千个子进程。我不知道您的环境,可能存在解释缺少输出的缓冲问题 - 例如,IDLE 不会显示子进程的输出。我建议你用少量文件(比如 5 个左右)来测试它来证明这个原理。确实,您为每个文件运行子进程的设计是值得怀疑的。实际上,应该更改 python 脚本以访问文件,而不是像这样运行它们。
      【解决方案4】:

      对于当前目录中的每个文件。

      for %f in (*) do C:\Python34\python.exe "%f"
      

      更新: 注意 %f 上的引号。如果您的文件名称中包含空格,则需要它们。您也可以在 do 之后放置任何路径+可执行文件。

      如果我们想象您的文件如下所示:

      ./process.py

      ./myScripts/file1.py

      ./myScripts/file2.py

      ./myScripts/file3.py

      ...

      在你的例子中,只是:

      for %f in (.\myScripts\*) do process.py "%f"
      

      这会调用:

      process.py ".\myScripts\file1.py"
      process.py ".\myScripts\file2.py"
      process.py ".\myScripts\file3.py"
      

      【讨论】:

      • 我将如何使用此构造引用我的 python 脚本?
      猜你喜欢
      • 2016-12-10
      • 2012-12-23
      • 2020-08-12
      • 2017-09-13
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      相关资源
      最近更新 更多