1

特定のフォルダー内のファイルを別の形式に変換するために ffmpeg を使用するアプリを作成しました。フォルダーは、.mpg、.mp3、.avi、.flv ... または追加することを決定したあらゆるオーディオ/ビデオ ファイルをホストします。アプリを使用して、名前にスペースが含まれる変換するファイルを選択すると、問題が発生します。ファイルを別の形式に変換せずに、アプリはすぐに閉じます。現在、名前にスペースが含まれるファイルは、app->ffmpeg で変換する前に名前を変更する必要があります。アプリの開始時から、特定のフォルダー内のファイル名のスペースをチェックし、それらのスペースをアンダースコア ('_') に置き換える関数を作成しようとしています。正規表現に問題があります。問題を解決するためにそれらを作成/構成するのが苦手です。ファイル名の空白/空白スペースを見つけるために使用する正しい正規表現について誰かにアドバイスしてもらえますか? 以下は私がこれまでに持っているものです:

import os
import re


pattern = r"([^\s]+(?=\.(mp3|mov|mpg|mp4|flv|avi|mpeg4|mkv|mpeg|mpg2|.wav))\.\2)"


def replace_Wspace(self, fName):
    if re.match(pattern, fName):
        fname = fName.replace(' ', '_')
    return fname

要求に応じて、ffmpeg への呼び出しを処理するアプリからコードのセクションを追加しています。

def convertButton(self, e):

    unit1 = self.format_combo1.GetValue()
    #Media Formats
    unit2 = self.format_combo2.GetValue()
    unit3 = self.format_combo3.GetValue()
    unit4 = None
    unit5 = self.format_combo5.GetValue()
    bitRate = self.format_combo6.GetValue()
    unit6 = bitRate
    if unit3 == '-qmax':
        unit4 = self.format_combo4.GetValue()
    else:
        pass

    os.chdir("c:\\d-Converter\\ffmpeg\\bin")
    wrkdir = os.getcwd()

    newfile = unit1
    stripped = newfile.strip('mpeg3aviovfl4w2c.') #Strips the extension from the original file name


    progname='c:\\d-Converter\\ffmpeg\\bin\\ffmpeg.exe' + ' -i '

    preset1_a='-vn -ar 44100 -ac 2 -ab'
    preset1_b='-f mp3 '
    preset_mp3='.mp3'

    chck_unit1 = self.my_endswith(unit1)



    while True:    
        if unit5 == 'video to mp3':

            if unit6 == 'k/bs' or unit6 == '':
                amsg = wx.MessageDialog(None, 'You must select a bit rate.', 'Media Converter', wx.ICON_INFORMATION)
                amsg.ShowModal()
                amsg.Destroy()
                break

            elif unit5 == 'video to mp3' and unit6 != 'k/bs' or unit6 != '':
                self.button.Disable()
                self.button2.Enable()
                self.format_combo1.Disable()
                self.format_combo2.Disable()
                self.format_combo3.Disable()
                self.format_combo4.Disable()
                self.format_combo5.Disable()
                self.format_combo6.Disable()
                startWorker(self.LongTaskDone, self.LongTask3, wargs=(progname, wrkdir, unit1, preset1_a, unit6, preset1_b, stripped, preset_mp3))
                break
            elif unit1 != unit1.endswith(".mpg") or unit1.endswith(".mpeg") or unit1.endswith(".avi") or unit1.endswith(".mp4") or unit1.endswith(".flv"):
                bmsg = wx.MessageDialog(None, 'You must select a valid format to convert to .mp3.', 'Media Converter', wx.ICON_INFORMATION)
                bmsg.ShowModal()
                bmsg.Destroy()
                break

        else:
            pass



        if unit1 == 'Select Media' or unit1 == '':
            amsg = wx.MessageDialog(None, 'You must select a media file!', 'Media Converter', wx.ICON_INFORMATION)
            amsg.ShowModal()
            amsg.Destroy()
            break


        elif unit2 == 'Select Format' or unit2 == '' or unit2 == chck_unit1:
            amsg = wx.MessageDialog(None, 'You must select a valid format', 'Media Converter', wx.ICON_INFORMATION)
            amsg.ShowModal()
            amsg.Destroy()
            break


        elif unit3 == 'Select Quality' or unit3 == '':
            amsg = wx.MessageDialog(None, 'You must select quality', 'Media Converter', wx.ICON_INFORMATION)
            amsg.ShowModal()
            amsg.Destroy()
            break

        elif unit3 != 'Select Quality' or unit3 != '':
            self.format_combo5.Disable()

            if unit3 == '-qmax':
                if unit4 == '0' or unit4 == '':
                    amsg = wx.MessageDialog(None, 'You must select number between 1-8.', 'Media Converter', wx.ICON_INFORMATION)
                    amsg.ShowModal()
                    amsg.Destroy()
                    break
                else:
                    self.button.Disable()
                    self.button2.Enable()
                    self.format_combo1.Disable()
                    self.format_combo2.Disable()
                    self.format_combo3.Disable()
                    self.format_combo4.Disable()
                    self.format_combo5.Disable()
                    startWorker(self.LongTaskDone, self.LongTask2, wargs=(progname,wrkdir,unit1,unit3,unit4,stripped,unit2))
                    break
            elif unit3 == '-sameq':
                self.button.Disable()
                self.button2.Enable()
                self.format_combo1.Disable()
                self.format_combo2.Disable()
                self.format_combo3.Disable()
                self.format_combo4.Disable()
                self.format_combo5.Disable()
                startWorker(self.LongTaskDone, self.LongTask, wargs=(progname,wrkdir,unit1,unit3,stripped,unit2))
                break   




def LongTask(self, progname, wrkdir, unit1, unit3, stripped, unit2):
    convert_file1 = progname + wrkdir + '\\' + unit1 + ' ' + unit3 + ' ' + stripped + unit2
    self.statusbar.SetStatusText("Converting: " + unit1 + "...")
    os.system(convert_file1)
    print convert_file1


def LongTask2(self, progname, wrkdir, unit1, unit3, unit4, stripped, unit2):
    convert_file2 = progname + wrkdir + '\\' + unit1 + ' ' + unit3 + ' ' + unit4 + ' ' + stripped + unit2
    self.statusbar.SetStatusText("Converting: " + unit1 + "...")
    os.system(convert_file2)


def LongTask3(self, progname, wrkdir, unit1, preset1_a, unit6, preset1_b, stripped, preset_mp3):
    convert_file3 = progname + wrkdir + '\\' + unit1 + ' ' + preset1_a + ' ' + unit6 + ' ' + preset1_b + stripped + preset_mp3
    self.statusbar.SetStatusText("Converting: " + unit1 + "...")
    os.system(convert_file3)
    print convert_file3

def LongTask4(self, progdir, wrkdir, prog_dir, progdir3, f_string, s_string2, vid_format):
    convert_file4 = progdir + f_string + prog_dir + s_string2 + progdir3 + f_string.strip('mpegaviw24ofl.') + vid_format
    self.statusbar.SetStatusText("Converting: " + f_string + "...")
    os.system(convert_file4)
    print convert_file4
4

3 に答える 3

6

正規表現の代わりに use を使用するfName.endswith()と、すべての音声拡張機能の引数としてタプルを指定でき、それらのいずれかで終わるTrue場合に返されます。次に例を示します。fName

audio = ('.mp3','.mov','.mpg','.mp4','.flv','.avi','.mpeg4','.mkv','.mpeg','.mpg2','.wav')
if fName.endswith(audio) and ' ' in fName:
    return fName.replace(' ', '_')
return fName

スペースがない場合、または拡張子が異なる場合は、元の文字列を変更せずに返します。

または、次を使用できますos.path.splitext()

audio = set(('.mp3','.mov','.mpg','.mp4','.flv','.avi','.mpeg4','.mkv','.mpeg','.mpg2','.wav'))
if os.path.splitext(fName)[1] in audio and ' ' in fName:
    return fName.replace(' ', '_')
return fName
于 2013-01-07T18:18:34.133 に答える
1

これには正規表現は必要ないと思います。簡単に使用できますif ' ' in file:

そのようです:

import os
dir = '.'
for file in os.listdir(dir)
  if ' ' in file:
    os.rename(file,file.replace(' ','_'))

一括print file名前変更を試みる前に、正しいディレクトリにいることをテストすることをお勧めします。

受け入れ可能なファイル形式であることを確認する必要がある場合は、 os.path.splitext() を使用して拡張子を取得します。

extensions = ('.mp3','.mov','.mpg','.mp4','.flv','.avi','.mpeg4','.mkv','.mpeg','.mpg2','.wav')
fname, ext = os.path.splitext(file)
if ext in extensions:
  ...
于 2013-01-07T18:18:17.343 に答える
1

FJの答えは素晴らしいです。本当にスペースが気になっていて、iTunes のようにスペースを変更したい場合は、次のようなことをしたいと思うかもしれません:

audio = ('.mp3','.mov','.mpg','.mp4','.flv','.avi','.mpeg4','.mkv','.mpeg','.mpg2','.wav')
spaces=['\t',' ','\r','\n','\v']  # etc -- other nasty space like characters...
if fName.endswith(audio) and any(space in fName for space in spaces):
    return ''.join(c if c not in spaces else '_' for c in fName)
...

fName の文字のようなすべての潜在的なスペースを「_」にキャッチしています

あなたが持っている場合:

fName='file name\twith\nstuff\vin it'

次のようになります。

file_name_with_stuff_in_it     
于 2013-01-07T20:01:16.437 に答える