باستخدام Python لتنفيذ أمر في كل ملف في مجلد
سؤال
أحاول إنشاء برنامج نصي ثعبان من شأنه:
- ابحث في المجلد "/ الإدخال"
- لكل فيديو في هذا المجلد، قم بتشغيل أمر MENCODER (إلى تحويلها إلى شيء قابل للتشغيل على هاتفي)
- بمجرد انتهاء Mencoder عن تشغيله، احذف الفيديو الأصلي.
هذا لا يبدو صعبا للغاية، لكنني أمتص في بيثون :)
أي أفكار حول ما يجب أن يبدو البرنامج النصي؟
سؤال المكافأة: يجب أن أستخدم
Os.System.
أو
subprocess.call.
?
يبدو أن Subprocess.call يسمح لكي نصي أكثر قابلية للقراءة، حيث يمكنني كتابة الأمر مثل هذا:
cmdline = ['mencoder'، sourcevideo، '-ovc'، 'نسخ'، '-oac'، 'نسخ'، '-s'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')
لقد قمت بإزالة الأمر MENCODER، من أجل الوضوح ولأنني ما زلت أعمل عليه.
شكرا للجميع على ما ادخلته.
المحلول
للعثور على جميع أسماء الملفات os.listdir()
.
ثم أنت حلقة على أسماء الملفات. مثل ذلك:
import os
for filename in os.listdir('dirname'):
callthecommandhere(blablahbla, filename, foo)
إذا كنت تفضل الإعالة الفرعية، فاستخدم Subprocess. :-)
نصائح أخرى
يستخدم 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 أفضل بالتأكيد، لأنك لا تحتاج إلى القيام بأي قذيفة نقلا عن أسماء الملفات. نظام Os.System أفضل عندما تحتاج إلى قبول أي أمر شل صالح، على سبيل المثال تلقى من المستخدم في ملف التكوين.
ربما تكون بيثون مبالحة لهذا.
for file in *; do mencoder -some options $file; rm -f $file ; done
AVI
ل MPG
(اختر ملحقاتك):
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
أو يمكنك استخدام وظيفة 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)
كان لدي مشكلة مماثلة، مع الكثير من المساعدة من الويب وهذا المنشور الذي قمت به تطبيق صغير، هدفي هو VCD و SVCD وأنا لا أحذف المصدر، لكنني أعتقد أنه سيكون من السهل إلى حد ما التكيف مع خاص بك الاحتياجات.
يمكنه تحويل الفيديو 1 وقطعه أو يمكنك تحويل جميع مقاطع الفيديو في مجلد، وإعادة تسميةها ووضعها في مجلد فرعي / VCD
أنا أيضا إضافة واجهة صغيرة، آمل أن يجد شخص آخر أنه مفيد!
أضع الرمز والملف هنا BTW: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/