2012-02-10 14 views
2

subprocess.call()を使用してpythonスクリプトで$ mv <file> ..を実行しようとしています。私はこれを通常のファイル名で行うことができますが、特定のファイル名では動作しません。私はスクリプトに与えられたファイル名の制御権を持っていません。次に例を示します。Pythonで複雑なファイル名でファイルを移動するには

>>> /Users/David/Desktop/itunes_finalize/TheInventionOfLying_CSP/ 
    ITunes\ ES\ Film\ Metadata_10_LaunchTitles\(4th\ Batch\)_08_20_2010.XLS 

No such file or directory 

方法:私は試してみて、Pythonのプロンプトに直接コマンドを実行し、そこにファイルをドラッグすると

Mファイル名が"ITunes ES Film Metadata_10_LaunchTitles(4th Batch)_08_20_2010.XLS"

で、これは私が得るものですこのファイルをPythonスクリプトで動かしてみましょうか?

更新:答えを

おかげで、これは私がそれをやってしまった方法です:

for file in glob.glob(os.path.join(dir, '*.[xX][lL][sS]')): 
    shutil.move(file, os.path.join(os.path.dirname(file), os.path.pardir)) 
+2

なぜ 'shutil.move'や' os.rename'の代わりに 'subprocess.call()'を使用していますか? – geoffspear

+0

彼はおそらくそれについて知りませんでした...私は彼の質問の調子がこの無知に対処すると思います。誰もが「電池を含む」という言葉に慣れているわけではありません。 ;-) – mvanveen

答えて

4

subprocessここに行くのは最良の方法ではありません。たとえば、POSIXに準拠していないオペレーティングシステムを使用している場合はどうなりますか?

shutilモジュールを確認してください。ファイル名の実際の文字列を見つけることは困難である場合

>>> import shutil 
>>> shutil.move(src, dest) 

あなたが望むものをパターンマッチにglob.globを使用することができます。たとえば、問題の.XLSファイルを含むディレクトリからスクリプト/プロンプトを実行している場合は、次の操作を実行できます。

>>> import glob 
>>> glob.glob('*ITunes*.XLS') 

リストには、そのパターンに合ったすべてのファイル文字列が表示されます。

4

よりもむしろsubprocessを使用して、新しいプロセスを生成、それをただやってshutil.move()を使用しますPython。そうすれば、名前は再解釈されず、エラーの可能性はほとんどありません。

0

スペースや括弧などはシェルの問題です。シェルに渡さなければ、Pythonでエスケープする必要はありません。

open('*WOW!* Rock&Roll(uptempo).mp3') 
+2

これはシェルについての素晴らしいアドバイスだと思っていますが、「このファイルをPythonスクリプトで動かすにはどうすればよいですか? – mvanveen

関連する問題