使用Python在文件夹中的每个文件上执行命令

Man*_*anu 53 python foreach mencoder

我正在尝试创建一个Python脚本:

  1. 查看文件夹"/ input"
  2. 对于该文件夹中的每个视频,运行mencoder命令(将它们转码为可在手机上播放的内容)
  3. mencoder完成运行后,删除原始视频.

这似乎并不太难,但我吮吸python :)

关于脚本应该是什么样子的任何想法?

奖金问题:我应该使用

使用os.system

要么

subprocess.call

Subprocess.call似乎允许更易读的脚本,因为我可以像这样编写命令:

cmdLine = ['mencoder',sourceVideo,' - ov','copy',' - oac','copy',' - s','00:02:54',' - endpos','00:00: 54',' - o',destinationVideo]

编辑:好的,这有效:

import os, subprocess

bitrate = '100'
mencoder = 'C:\\Program Files\\_utilitaires\\MPlayer-1.0rc2\\mencoder.exe'
inputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\input'
outputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\output'

for fichier in os.listdir(inputdir):
    print 'fichier :' + fichier
    sourceVideo = inputdir + '\\' + fichier
    destinationVideo = outputdir + '\\' + fichier[:-4] + ".mp4"

    commande = [mencoder,
               '-of',
               'lavf',
               [...]
               '-mc',
               '0',

               sourceVideo,
               '-o',
               destinationVideo]

    subprocess.call(commande)

os.remove(sourceVideo)
raw_input('Press Enter to exit')
Run Code Online (Sandbox Code Playgroud)

为清楚起见,我已经删除了mencoder命令,因为我还在努力.

感谢大家的投入.

Len*_*bro 107

要查找所有文件名使用os.listdir().

然后循环文件名.像这样:

import os
for filename in os.listdir('dirname'):
     callthecommandhere(blablahbla, filename, foo)
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢子进程,请使用子进程.:-)

  • @Maciej:在扩展上过滤很容易.还有一个可以使用的glob.`import glob; glob.glob( '/ TMP/*.PY')` (3认同)
  • 这将获得子目录名称和文件,并且不会递归到子目录中.这可能是Manu实际需要的,但如果您不希望它在子目录上出错,那就不会那么简单了. (2认同)

Mac*_*cki 26

使用os.walk以递归方式遍历目录内容:

import os

root_dir = '.'

for directory, subdirectories, files in os.walk(root_dir):
    for file in files:
        print os.path.join(directory, file)
Run Code Online (Sandbox Code Playgroud)

os.system和subprocess.call之间没有真正的区别 - 除非您必须处理奇怪命名的文件(文件名包括空格,引号等).如果是这种情况,subprocess.call肯定更好,因为您不需要对文件名进行任何shell引用.当您需要接受任何有效的shell命令时,例如在配置文件中从用户接收的命令,os.system会更好.


mod*_*diX 14

Python3中新的推荐方式是使用pathlib

from pathlib import Path

mydir = Path("path/to/my/dir")
for file in mydir.glob('*.mp4'):
    print(file.name)
    # do your stuff
Run Code Online (Sandbox Code Playgroud)

您可以使用任何过滤器,甚至*.mp4是像**/*.mp4. 如果您想使用多个扩展名,您可以简单地使用*or **/*(递归)迭代所有文件,并使用以下命令检查每个文件的扩展名file.name.endswith(('.mp4', '.webp', '.avi', '.wmv', '.mov'))


Kur*_*urt 10

Python可能有点矫枉过正.

for file in *; do mencoder -some options $file; rm -f $file ; done
Run Code Online (Sandbox Code Playgroud)

  • 首先,OP要求使用Python而不是Bash,其次,如果你要发布答案,你应该确保它不会传递@Aleks-DanielJakimenko-A提到的任何坏习惯。 (3认同)
  • >> Python可能肯定不是 (2认同)