1216

Python インターフェイスを調べましたosが、ファイルを移動する方法が見つかりませんでした。$ mv ...Pythonで同等のことを行うにはどうすればよいですか?

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

10 に答える 10

1850

os.rename()os.replace()、またはshutil.move()

すべて同じ構文を使用します。

import os
import shutil

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

file.fooソース引数と宛先引数の両方にファイル名 ( ) を含める必要があることに注意してください。変更された場合、ファイルは名前が変更され、移動されます。

また、最初の 2 つのケースでは、新しいファイルが作成されるディレクトリがすでに存在している必要があることに注意してください。Windows では、その名前のファイルが存在してはなりません。存在しない場合は例外がos.replace()発生しますが、その場合でもファイルは暗黙のうちに置き換えられます。

他の回答に関するコメントで指摘されているように、ほとんどの場合、shutil.move単純に呼び出します。os.renameただし、宛先がソースとは異なるディスク上にある場合は、代わりにソース ファイルをコピーしてから削除します。

于 2012-01-13T22:19:58.390 に答える
293

os.rename()とはどちらもファイルの名前を変更しますがshutil.move()、Unix の mv コマンドに最も近いコマンドはshutil.move(). 違いはos.rename()、ソースと宛先が異なるディスク上にある場合は機能しないのに対し、shutil.move()ファイルはディスクに依存しないことです。

于 2013-05-30T21:12:13.437 に答える
41

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

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

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 を使用して、フォルダー名が実際に変更されたことを確認しました。これは、宛先をソースに戻す Shutil です。

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

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

これで、フォルダーとそのファイルをソースから宛先に移動し、再び元に戻しました。

于 2013-02-22T02:30:13.887 に答える
25

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

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)

完全に機能するようになりました。これがお役に立てば幸いです。

編集:

これを関数に変換しました。この関数は、ソース ディレクトリと宛先ディレクトリを受け入れ、存在しない場合は宛先フォルダーを作成し、ファイルを移動します。また、src ファイルのフィルタリングも可能です。たとえば、画像のみを移動する場合は、 pattern を使用'*.jpg'します。デフォルトでは、ディレクトリ内のすべてが移動されます。

import os, shutil, pathlib, fnmatch

def move_dir(src: str, dst: str, pattern: str = '*'):
    if not os.path.isdir(dst):
        pathlib.Path(dst).mkdir(parents=True, exist_ok=True)
    for f in fnmatch.filter(os.listdir(src), pattern):
        shutil.move(os.path.join(src, f), os.path.join(dst, f))
于 2016-11-12T19:02:42.983 に答える
15

質問はファイルの名前をファイルに変更することではなく、多くのファイルをディレクトリに移動することに関するものであるため、受け入れられた答えは正しいものではありません。shutil.move作業を行いますが、宛先には明示的なファイル名が必要なため、この目的os.renameには役に立ちません(コメントに記載されているように)。

于 2016-10-17T14:23:39.883 に答える
0

shellこれは、使用を有効にしないソリューションmvです。

from subprocess import Popen, PIPE, STDOUT

source = "path/to/current/file.foo", 
destination = "path/to/new/destination/for/file.foo"

p = Popen(["mv", "-v", source, destination], stdout=PIPE, stderr=STDOUT)
output, _ = p.communicate()
output = output.strip().decode("utf-8")
if p.returncode:
    print(f"E: {output}")
else:
    print(output)
于 2018-09-12T12:38:22.623 に答える