2009-07-13 54 views
39

我試圖創造一個Python腳本對每個文件執行的命令將:使用Python到一個文件夾

  1. 查找到文件夾「/輸入」
  2. 該文件夾中的每個視頻,運行mencoder命令(將它們轉碼爲我手機上可播放的內容)
  3. 一旦mencoder完成他的運行,刪除原始視頻。

這似乎並不太難,但我吮吸蟒蛇:)

對劇本應該是什麼樣子的任何想法?

獎金的問題:我應該使用

使用os.system

subprocess.call

Subprocess.call似乎允許更可讀腳本,因爲我可以寫這樣的命令:

CMDLINE = [ '的mencoder', sourceVideo, '-ovc', 「拷貝」, '-OAc', '複製', '-ss','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') 

我已經刪除MEncoder的命令,爲了清楚,因爲我還在做這個工作。

感謝大家的意見。

+0

格兒我仍然有同樣的問題,我在我剛纔的問題; 「窗口找不到指定的文件」。 Python和/或Windows並不是文件和文件夾名稱中的空格。 ( – Manu 2009-07-13 17:23:21

+0

)如果文件路徑中有空格,需要在文件路徑中加雙引號 – tgray 2009-07-13 17:27:11

回答

69

要找到所有文件名,請使用os.listdir()

然後你遍歷文件名。像這樣:

import os 
for filename in os.listdir('dirname'): 
    callthecommandhere(blablahbla, filename, foo) 

如果您喜歡子過程,請使用子過程。 :-)

+2

這會得到子目錄名和文件,並且不會遞歸到子目錄中,這可能是Manu實際需要的,但它如果你不希望它在子目錄中出錯,那麼這樣做不會那麼簡單 – 2009-07-13 17:03:44

+0

那麼輸入文件夾應該只包含視頻文件,不包含子目錄 – Manu 2009-07-13 17:20:38

+3

@Maciej:在擴展上過濾很容易,有一個glob可以也可以使用`import glob; glob.glob('/ tmp/*。py')` – 2009-07-13 18:30:26

22

使用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) 

沒有真正的區別使用os.system之間subprocess.call這裏 - 除非你有對付奇怪命名的文件(文件名包括空格,引號等)。如果是這種情況,subprocess.call肯定會更好,因爲您不需要對文件名進行任何shell引用。操作系統。當您需要接受任何有效的shell命令時,系統會更好。從配置文件中的用戶接收。

2

AVIMPG(選擇你的擴展):

files = os.listdir('/input') 
for sourceVideo in files: 
    if sourceVideo[-4:] != ".avi" 
     continue 
    destinationVideo = sourceVideo[:-4] + ".mpg" 
    cmdLine = ['mencoder', sourceVideo, '-ovc', 'copy', '-oac', 'copy', '-ss', 
     '00:02:54', '-endpos', '00:00:54', '-o', destinationVideo] 
    output1 = Popen(cmdLine, stdout=PIPE).communicate()[0] 
    print output1 
    output2 = Popen(['del', sourceVideo], stdout=PIPE).communicate()[0] 
    print output2 
1

或者你可以使用os.path.walk功能,它做更多工作,爲你的不僅僅是os.walk:

愚蠢的例如:

def walk_func(blah_args, dirname,names): 
    print ' '.join(('In ',dirname,', called with ',blah_args)) 
    for name in names: 
     print 'Walked on ' + name 

if __name__ == '__main__': 
    import os.path 
    directory = './' 
    arguments = '[args go here]' 
    os.path.walk(directory,walk_func,arguments) 
11

Python對此可能是矯枉過正。

for file in *; do mencoder -some options $file; rm -f $file ; done 
1

我有一個類似的問題,有很多從網上和這個職位,我做了一個小應用程序的幫助,我的目標是VCD和SVCD,我不刪除源,但我認爲這將是很容易適應你自己的需求。

它可以轉換1路視頻和削減它或可以轉換所有的視頻文件夾中,重命名它們並把它們放在一個子文件夾/ VCD

我還添加了一個小界面,希望別人覺得它有用!

我把代碼和文件在這裏順便說一句:http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/

相關問題