2012-01-13 11 views
458

Python osインターフェイスを調べましたが、ファイルを移動する方法を見つけることができませんでした。 Pythonで$ mv ...相当の処理を行うにはどうすればよいですか?上の、両方のケースでは、新しいファイルが作成されているディレクトリが存在しなければならないことPythonでファイルを移動する方法

os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo") 
shutil.move("path/to/current/file.foo", "path/to/new/destination/for/file.foo") 

注、(しかし:

>>> source_files = '/PATH/TO/FOLDER/*' 
>>> destination_folder = 'PATH/TO/FOLDER' 
>>> # equivalent of $ mv source_files destination_folder 
+0

[gnu-coreutilsの 'mv'コマンド](https://www.gnu.org/software/coreutils/manual/html_node/mv-invocation.html)に精通している方、pythonの' shutil.move '' shutil.move'関数が異なる場合があります。 [完全な書面を得るためにここに行く](https://stackoverflow.com/questions/31813504)。 **簡単に言えば、Pythonの 'shutil。moveは例外を発生させますが(** gnu-coreutils 'mv'は**目的地がディレクトリで、ディレクトリに既にソースと同じ名前のファイルがある場合)前の文章)。 –

答えて

664

os.rename()または

どちらshutil.move()は同じ構文を採用しますWindowsの場合、その名前のファイルは許可されないか、または例外が発生する必要があります。また、ソース引数と宛先引数の両方にファイル名(file.foo)を含める必要があります。変更された場合、ファイルの名前が変更され、移動されます。

多くの場合、shutil.moveは単にos.renameを呼び出します。ただし、コピー先がソースとは別のディスクにある場合は、代わりにコピー元ファイルを削除します。

+4

私はos.renameがディレクトリのために働いていないと思う唯一の人ですか?私は引用: "dstがディレクトリの場合、OSErrorが発生します。" – Fabian

+12

'shutil.move'はディレクトリに対して動作します。相対パス 'shutil.move(f.name、" tmp/")'または絶対パス 'shutil.move(f.name、"/Users/hello/tmp/")'を使用することができます。 Python2.7.9でチェックされたパスの* ** '〜' **、Mac OS X. – whyisyoung

+2

'〜'はシェル構造であり、置き換えられていない慣習以外のファイルパス自体とは何の関係もありません。ホームディレクトリを本当に含めたい場合は、代わりに 'os.getenv( 'HOME')'を使い、必要に応じて希望のパスの部分と連結してください。 – amn

30

os.renameまたはshutil.moveのいずれかの場合は、モジュールをインポートする必要があります。 移動したすべてのファイルを取得するために*文字は必要ありません。

awesome.txtという名前のファイルがある/ opt/awesomeにsourceというフォルダがあります。

in /opt/awesome 
○ → ls 
source 
○ → ls source 
awesome.txt 

python 
>>> source = '/opt/awesome/source' 
>>> destination = '/opt/awesome/destination' 
>>> import os 
>>> os.rename(source, destination) 
>>> os.listdir('/opt/awesome') 
['destination'] 

os.listdirを使用して、フォルダ名が実際に変更されたことを確認しました。 宛先をソースに戻すシャッターがあります。

>>> import shutil 
>>> shutil.move(destination, source) 
>>> os.listdir('/opt/awesome/source') 
['awesome.txt'] 

今回は、作成したawesome.txtファイルが存在することを確認するために、ソースフォルダ内をチェックしました。それはそこにあります:)

これで、フォルダとそのファイルをソースからデスティネーションに移動して元に戻しました。

+4

http://docs.python.org/2/library/shutil.htmlこのドキュメントでは、shutil.moveメソッド用にパラメータを切り替えていることが示されています。 – mac10688

+1

ファイルをソースから移動して戻ってきたことを確認するために、デスティネーションとソースを逆にしました....どのようにそのことがわかりましたか。 – jmontross

180

os.rename()shutil.move()はどちらもファイルの名前を変更しますが、Unixのmvコマンドに最も近いコマンドはshutil.move()です。違いは、ソースと宛先が別々のディスクにある場合、os.rename()は動作しません。一方、shutil.move()は、ファイルがどのディスクにあるか気にしません。

+52

'shutil.move()'は、宛先が現在のファイルシステム上にある場合に 'os.rename()'を使います。さもなければ、 'shutil.move()'は 'shutil.copy2()'を使ってソースをデスティネーションにコピーして、ソースを削除します。 –

+7

['shutil.copy2()'はすべてのファイルメタデータをコピーできません](https://docs.python.org/2/library/shutil.html)ので、 cp -p'、それから 'rm'、私は集まります。 – 2rs2ts

+9

注意:宛先がすでに存在する場合、Python 2.7.3のshutil.moveは失敗します。したがって、可能であれば、エラーをキャッチするか、ファイル/ディレクトリを手動で削除してから移動してください。 – Dana

8

答えが正しいのは、ファイルをファイルに名前を変更するのではなく、多くのファイルをディレクトリに移動することであるためです。 shutil.moveは作業を行いますが、この目的のためには、宛先には明示的なファイル名が必要であるため、os.renameは無用です(コメントに記載されています)。

5

これは私が現時点で使用しているものです:今

import os, shutil 
path = "/volume1/Users/Transfer/" 
moveto = "/volume1/Users/Drive_Transfer/" 
files = os.listdir(path) 
files.sort() 
for f in files: 
    src = path+f 
    dst = moveto+f 
    shutil.move(src,dst) 

完全に機能します。これがあなたを助けることを願っています

関連する問題