10.10。 シャティル —高レベルのファイル操作
ソースコード: :source: `Lib / shutil.py`
shutil モジュールは、ファイルおよびファイルのコレクションに対する多数の高レベルの操作を提供します。 特に、ファイルのコピーと削除をサポートする機能が提供されています。 個々のファイルの操作については、 os モジュールも参照してください。
警告
高レベルのファイルコピー関数( shutil.copy()、 shutil.copy2())でさえ、すべてのファイルメタデータをコピーすることはできません。
POSIXプラットフォームでは、これはファイルの所有者とグループ、およびACLが失われることを意味します。 Mac OSでは、リソースフォークやその他のメタデータは使用されません。 これは、リソースが失われ、ファイルタイプと作成者コードが正しくないことを意味します。 Windowsでは、ファイル所有者、ACL、および代替データストリームはコピーされません。
10.10.1。 ディレクトリとファイルの操作
- shutil.copyfileobj(fsrc, fdst[, length])
- ファイルのようなオブジェクト fsrc の内容をファイルのようなオブジェクト fdst にコピーします。 整数 length は、指定されている場合、バッファーサイズです。 特に、負の length 値は、ソースデータをチャンクでループせずにデータをコピーすることを意味します。 デフォルトでは、制御されていないメモリ消費を避けるために、データはチャンクで読み取られます。 fsrc オブジェクトの現在のファイル位置が0でない場合、現在のファイル位置からファイルの終わりまでの内容のみがコピーされることに注意してください。
- shutil.copyfile(src, dst)
- src という名前のファイルの内容(メタデータなし)を dst という名前のファイルにコピーします。 dst は完全なターゲットファイル名である必要があります。 ターゲットディレクトリパスを受け入れるコピーについては、 shutil.copy()を参照してください。 src と dst が同じファイルの場合、エラーが発生します。 宛先の場所は書き込み可能である必要があります。 そうしないと、
IOError
例外が発生します。 dst がすでに存在する場合は、置き換えられます。 キャラクターやブロックのデバイスやパイプなどの特殊ファイルは、この機能ではコピーできません。 src および dst は、文字列として指定されたパス名です。
- shutil.copymode(src, dst)
- src から dst に許可ビットをコピーします。 ファイルの内容、所有者、およびグループは影響を受けません。 src および dst は、文字列として指定されたパス名です。
- shutil.copystat(src, dst)
- 許可ビット、最終アクセス時刻、最終変更時刻、およびフラグを src から dst にコピーします。 ファイルの内容、所有者、およびグループは影響を受けません。 src および dst は、文字列として指定されたパス名です。
- shutil.copy(src, dst)
- ファイル src をファイルまたはディレクトリ dst にコピーします。 dst がディレクトリの場合、指定したディレクトリに src と同じベース名のファイルが作成(または上書き)されます。 許可ビットがコピーされます。 src および dst は、文字列として指定されたパス名です。
- shutil.copy2(src, dst)
copy()と同じですが、 copy2()もファイルメタデータを保持しようとする点が異なります。
copy2()は、 copystat()を使用してファイルメタデータをコピーします。 詳細については、 copystat()を参照してください。
- shutil.ignore_patterns(\*patterns)
このファクトリ関数は、 copytree() 'の ignore 引数の呼び出し可能オブジェクトとして使用できる関数を作成し、globスタイルのの1つに一致するファイルとディレクトリを無視します。 ]パターンが提供されます。 以下の例を参照してください。
バージョン2.6の新機能。
- shutil.copytree(src, dst, symlinks=False, ignore=None)
src をルートとするディレクトリツリー全体を再帰的にコピーします。 dst で指定された宛先ディレクトリは、まだ存在していてはなりません。 親ディレクトリが欠落しているだけでなく、作成されます。 ディレクトリのアクセス許可と時間は copystat()を使用してコピーされ、個々のファイルは shutil.copy2()を使用してコピーされます。
symlinks がtrueの場合、ソースツリーのシンボリックリンクは新しいツリーのシンボリックリンクとして表されますが、元のリンクのメタデータはコピーされません。 falseまたは省略した場合、リンクされたファイルの内容とメタデータが新しいツリーにコピーされます。
ignore が指定されている場合、 copytree()がアクセスしているディレクトリと、が返すコンテンツのリストを引数として受け取る呼び出し可能オブジェクトである必要があります。 os.listdir()。 copytree()は再帰的に呼び出されるため、 ignore 呼び出し可能オブジェクトは、コピーされるディレクトリごとに1回呼び出されます。 呼び出し可能オブジェクトは、現在のディレクトリに関連する一連のディレクトリ名とファイル名を返す必要があります(つまり、 2番目の引数の項目のサブセット); これらの名前は、コピープロセスでは無視されます。 ignore_patterns()を使用して、globスタイルのパターンに基づいて名前を無視する呼び出し可能オブジェクトを作成できます。
例外が発生すると、エラーが理由のリストとともに発生します。
このためのソースコードは、究極のツールではなく、例と見なす必要があります。
バージョン2.3で変更: エラーは、メッセージを出力するのではなく、コピー中に例外が発生した場合に発生します。
バージョン2.5で変更:エラーを発生させるのではなく、 dst を作成するために必要な中間ディレクトリを作成します。 copystat()を使用して、ディレクトリのアクセス許可と時間をコピーします。
バージョン2.6で変更: ignore 引数を追加して、コピーされる内容に影響を与えることができるようにしました。
- shutil.rmtree(path[, ignore_errors[, onerror]])
ディレクトリツリー全体を削除します。 パスはディレクトリを指している必要があります(ただし、ディレクトリへのシンボリックリンクではありません)。 ignore_errors がtrueの場合、削除の失敗に起因するエラーは無視されます。 falseまたは省略された場合、そのようなエラーは onerror で指定されたハンドラーを呼び出すことによって処理されます。省略された場合、例外が発生します。
onerror が指定されている場合は、 function 、 path 、および excinfo の3つのパラメーターを受け入れる呼び出し可能である必要があります。 最初のパラメーター function は、例外を発生させた関数です。 os.path.islink()、 os.listdir()、 os.remove()、または os.rmdir()[ X183X]。 2番目のパラメーター path は、 function に渡されるパス名になります。 3番目のパラメーター excinfo は、 sys.exc_info()によって返される例外情報になります。 onerror によって発生した例外はキャッチされません。
バージョン2.6で変更: パスがシンボリックリンクであることを明示的に確認し、その場合は
OSError
を発生させます。
- shutil.move(src, dst)
ファイルまたはディレクトリ( src )を別の場所( dst )に再帰的に移動します。
宛先が既存のディレクトリの場合、 src はそのディレクトリ内に移動されます。 宛先がすでに存在しているがディレクトリではない場合、 os.rename()のセマンティクスによっては上書きされる可能性があります。
宛先が現在のファイルシステム上にある場合は、 os.rename()が使用されます。 それ以外の場合、 src は( shutil.copy2()を使用して) dst にコピーされ、削除されます。
バージョン2.3の新機能。
- exception shutil.Error
この例外は、複数ファイル操作中に発生した例外を収集します。 copytree()の場合、例外引数は3タプルのリストです( srcname 、 dstname 、 exception )。
バージョン2.3の新機能。
10.10.1.1。 コピーツリーの例
この例は、上記の copytree()関数の実装であり、docstringは省略されています。 これは、このモジュールによって提供される他の多くの機能を示しています。
def copytree(src, dst, symlinks=False, ignore=None):
names = os.listdir(src)
if ignore is not None:
ignored_names = ignore(src, names)
else:
ignored_names = set()
os.makedirs(dst)
errors = []
for name in names:
if name in ignored_names:
continue
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try:
if symlinks and os.path.islink(srcname):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
copytree(srcname, dstname, symlinks, ignore)
else:
copy2(srcname, dstname)
# XXX What about devices, sockets etc.?
except (IOError, os.error) as why:
errors.append((srcname, dstname, str(why)))
# catch the Error from the recursive copytree so that we can
# continue with other files
except Error as err:
errors.extend(err.args[0])
try:
copystat(src, dst)
except WindowsError:
# can't copy file access times on Windows
pass
except OSError as why:
errors.extend((src, dst, str(why)))
if errors:
raise Error(errors)
ignore_patterns()ヘルパーを使用する別の例:
from shutil import copytree, ignore_patterns
copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
これにより、.pyc
ファイルと、名前がtmp
で始まるファイルまたはディレクトリを除くすべてがコピーされます。
ignore 引数を使用してロギング呼び出しを追加する別の例:
from shutil import copytree
import logging
def _logpath(path, names):
logging.info('Working in %s' % path)
return [] # nothing will be ignored
copytree(source, destination, ignore=_logpath)
10.10.2。 アーカイブ操作
圧縮ファイルとアーカイブファイルを作成および読み取るための高レベルのユーティリティも提供されます。 それらは zipfile および tarfile モジュールに依存しています。
- shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])
アーカイブファイルを作成します(例: zipまたはtar)、その名前を返します。
base_name は、作成するファイルの名前で、パスを含み、フォーマット固有の拡張子を除いたものです。 format はアーカイブ形式です。「zip」( zlib モジュールまたは外部
zip
実行可能ファイルが使用可能な場合)、「tar」、「gztar」(if zlib モジュールが使用可能)、または「bztar」( bz2 モジュールが使用可能な場合)。root_dir は、アーカイブのルートディレクトリとなるディレクトリです。 NS。 通常、アーカイブを作成する前に、 root_dir にchdirします。
base_dir は、アーカイブを開始するディレクトリです。 NS。 base_dir は、アーカイブ内のすべてのファイルとディレクトリに共通のプレフィックスになります。
root_dir と base_dir はどちらも、デフォルトで現在のディレクトリになります。
owner および group は、tarアーカイブを作成するときに使用されます。 デフォルトでは、現在の所有者とグループを使用します。
logger は、 PEP 282 と互換性のあるオブジェクトである必要があり、通常は logging.Logger のインスタンスです。
バージョン2.7の新機能。
- shutil.get_archive_formats()
アーカイブでサポートされている形式のリストを返します。 返されるシーケンスの各要素はタプル
(name, description)
です。デフォルトでは、 shutil は次の形式を提供します。
zip :ZIPファイル( zlib モジュールまたは外部
zip
実行可能ファイルが使用可能な場合)。tar :非圧縮のtarファイル。
gztar :gzipで圧縮されたtarファイル( zlib モジュールが使用可能な場合)。
bztar :bzip2で圧縮されたtarファイル( bz2 モジュールが使用可能な場合)。
register_archive_format()を使用して、新しいフォーマットを登録したり、既存のフォーマットに独自のアーカイバを提供したりできます。
バージョン2.7の新機能。
- shutil.register_archive_format(name, function[, extra_args[, description]])
name 形式のアーカイバを登録します。 function は、アーカイバを呼び出すために使用される呼び出し可能オブジェクトです。
指定した場合、 extra_args は
(name, value)
のシーケンスであり、アーカイバ呼び出し可能オブジェクトが使用されるときに追加のキーワード引数として使用されます。description は、アーカイバのリストを返す get_archive_formats()によって使用されます。 デフォルトは空のリストです。
バージョン2.7の新機能。
- shutil.unregister_archive_format(name)
サポートされている形式のリストからアーカイブ形式 name を削除します。
バージョン2.7の新機能。
10.10.2.1。 アーカイブの例
この例では、ユーザーの.ssh
ディレクトリにあるすべてのファイルを含むgzip圧縮されたtarファイルアーカイブを作成します。
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
>>> make_archive(archive_name, 'gztar', root_dir)
'/Users/tarek/myarchive.tar.gz'
結果のアーカイブには次のものが含まれます。
$ tar -tzvf /Users/tarek/myarchive.tar.gz
drwx------ tarek/staff 0 2010-02-01 16:23:40 ./
-rw-r--r-- tarek/staff 609 2008-06-09 13:26:54 ./authorized_keys
-rwxr-xr-x tarek/staff 65 2008-06-09 13:26:54 ./config
-rwx------ tarek/staff 668 2008-06-09 13:26:54 ./id_dsa
-rwxr-xr-x tarek/staff 609 2008-06-09 13:26:54 ./id_dsa.pub
-rw------- tarek/staff 1675 2008-06-09 13:26:54 ./id_rsa
-rw-r--r-- tarek/staff 397 2008-06-09 13:26:54 ./id_rsa.pub
-rw-r--r-- tarek/staff 37192 2010-02-06 18:23:10 ./known_hosts