2009-07-13 42 views
39

Tôi đang cố gắng để tạo ra một kịch bản Python rằng sẽ:Sử dụng Python để thực hiện một lệnh trên tất cả các tập tin trong một thư mục

  1. Nhìn vào thư mục "/ input"
  2. Đối với mỗi video trong thư mục đó , chạy lệnh mencoder (để chuyển mã chúng thành nội dung nào đó có thể phát trên điện thoại của tôi)
  3. Khi bộ mã hóa đã chạy xong, hãy xóa video gốc.

Đó dường như không quá khó, nhưng tôi suck lúc trăn :)

Bất kỳ ý tưởng về những gì kịch bản nên xem xét như thế nào?

Bonus câu hỏi: Tôi có nên sử dụng

os.system

hoặc

subprocess.call

?

Subprocess.call dường như cho phép cho một kịch bản dễ đọc hơn, kể từ khi tôi có thể viết lệnh như thế này:

cmdline = [ 'mencoder', sourceVideo, '-ovc', 'bản sao ', '-oac', 'bản sao', '-ss', '00: 02: 54' , '-endpos', '00: 00: 54' , '-o', destinationVideo]

EDIT: Ok, mà làm việc:

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') 

Tôi đã gỡ bỏ lệnh mencoder, cho rõ ràng và vì tôi vẫn đang làm việc trên nó.

Nhờ mọi người đã nhập dữ liệu của bạn.

+0

Grr tôi vẫn đang gặp cùng một vấn đề tôi đã có trong câu hỏi trước đây của tôi; "cửa sổ không thể tìm thấy tệp được chỉ định". Python và hoặc cửa sổ không phải là một fan hâm mộ của không gian trong tên tập tin và thư mục. :( – Manu

+0

Bạn sẽ cần dấu ngoặc kép xung quanh đường dẫn tệp nếu có dấu cách trong đó. – tgray

Trả lời

69

Để tìm tất cả tên tệp, hãy sử dụng os.listdir().

Sau đó, bạn lặp lại tên tệp. Giống như vậy:

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

Nếu bạn thích xử lý con, hãy sử dụng quy trình con. :-)

+2

Thao tác này sẽ giúp bạn lấy tên thư mục con cũng như tệp và sẽ không được chuyển vào thư mục con. Đây có thể là những gì Manu thực sự cần, nhưng Sẽ không đơn giản nếu bạn không muốn nó sai về các thư mục con –

+0

Cũng thư mục đầu vào chỉ chứa các tệp video, không có thư mục con nào – Manu

+3

@Maciej: Thật dễ dàng để lọc phần mở rộng. được sử dụng như là tốt 'glob glob. glob'lob ('/ tmp/*. py')' –

22

Sử dụng os.walk để lặp đệ quy trên nội dung thư mục:

import os 

root_dir = '.' 

for directory, subdirectories, files in os.walk(root_dir): 
    for file in files: 
     print os.path.join(directory, file) 

Không khác biệt thực sự giữa os.system và subprocess.call đây - trừ khi bạn phải đối phó với các tập tin lạ lùng tên (tên tập tin bao gồm cả không gian, dấu ngoặc kép và vv). Nếu đây là trường hợp, subprocess.call là chắc chắn tốt hơn, bởi vì bạn không cần phải làm bất kỳ shell-quoting trên tên tập tin. os.hệ thống tốt hơn khi bạn cần chấp nhận bất kỳ lệnh shell hợp lệ nào, ví dụ: đã nhận được từ người dùng trong tệp cấu hình.

+0

nghĩ rằng bạn có thể đã nhận được đơn đặt hàng sai ...... cho thư mục gốc, dir, tệp trong .... – ghostdog74

+0

Bạn nói đúng, tôi vừa sửa mã. Cảm ơn. –

+0

Đây chỉ là những gì tôi đang tìm kiếm. Về cơ bản một phiên bản python của "find. -type f" trên dòng lệnh linux. – chrowe

2

AVI-MPG (chọn phần mở rộng của bạn):

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 
+0

Trong dòng 5, tôi nghĩ rằng bạn có nghĩa là sourceVideo [: - 4] –

+0

'sourceVideo' chỉ chứa tên cơ sở của một đường dẫn. – SilentGhost

+0

Nếu bộ mã hóa cần chạy trong thư mục công việc, hãy thêm os.chdir ('/ input') – gimel

1

Hoặc bạn có thể sử dụng chức năng os.path.walk, mà không làm việc nhiều hơn cho bạn hơn là chỉ os.walk:

Một ngu ngốc ví dụ:

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) 
+2

os.path.walk không được hỗ trợ os.walk ngay bây giờ. –

11

Python có thể quá mức cần thiết cho việc này.

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

>> Python có thể bị overkil defintely không – ghostdog74

+0

Tôi sử dụng tập lệnh này như là một oportunity để tìm hiểu về Python – Manu

+1

"Khi tất cả các bạn có là một cái búa, tất cả mọi thứ trông giống như một móng tay" là loại bình luận của tôi là nhằm mục đích. – Kurt

1

Tôi đã có một vấn đề tương tự, với rất nhiều sự giúp đỡ từ các trang web và sau này tôi đã thực hiện một ứng dụng nhỏ, mục tiêu của tôi là VCD và SVCD và tôi không xóa các nguồn nhưng tôi nghĩ nó sẽ được khá dễ dàng để thích nghi với nhu cầu của riêng bạn.

Nó có thể chuyển đổi 1 video và cắt nó hoặc có thể chuyển đổi tất cả video trong một thư mục, đổi tên họ và đặt chúng trong một thư mục con/VCD

Tôi cũng thêm một giao diện nhỏ, hy vọng ai đó tìm thấy nó hữu ích!

Tôi đặt mã và tập tin trong đây btw: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/

+1

Có rất nhiều mã trong blog đó không liên quan đến câu hỏi.Nó có thể hữu ích nếu bạn rút ra các mã có liên quan và dán nó trong câu trả lời. Ngoài ra, nếu blog đã từng thay đổi hoặc đi xuống, thì câu trả lời này sẽ trở thành không có giá trị, trong khi nếu mã nằm trong câu trả lời, nó sẽ luôn là câu trả lời hợp lệ. – Nick

Các vấn đề liên quan