8

複雑なディレクトリ構造から 1 つの場所にファイルを移動したいと考えています。たとえば、私はこの深い階層を持っています:

foo/
    foo2/
        1.jpg
    2.jpg
    ...

私はそれが欲しい:

1.jpg
2.jpg
...

私の現在の解決策:

def move(destination):
    for_removal = os.path.join(destination, '\\')
    is_in_parent = lambda x: x.find(for_removal) > -1
    with directory(destination):
        files_to_move = filter(is_in_parent,
                               glob_recursive(path='.'))
    for file in files_to_move:
        shutil.move(file, destination)

定義:directoryおよびglob_recursive. 私のコードは、ファイルを任意の宛先ではなく、共通の親ディレクトリにのみ移動することに注意してください。

すべてのファイルを複雑な階層から単一の場所に簡潔かつエレガントに移動するにはどうすればよいですか?

4

5 に答える 5

4

ファイルが衝突した場合はファイルの名前も変更されます (実際の移動をコメントアウトし、コピーに置き換えました)。

import os
import sys
import string
import shutil

#Generate the file paths to traverse, or a single path if a file name was given
def getfiles(path):
    if os.path.isdir(path):
        for root, dirs, files in os.walk(path):
            for name in files:
                yield os.path.join(root, name)
    else:
        yield path

destination = "./newdir/"
fromdir = "./test/"
for f in getfiles(fromdir):
    filename = string.split(f, '/')[-1]
    if os.path.isfile(destination+filename):
        filename = f.replace(fromdir,"",1).replace("/","_")
    #os.rename(f, destination+filename)
    shutil.copy(f, destination+filename)
于 2013-07-09T12:04:16.207 に答える
3

ディレクトリを再帰的に実行し、ファイルを移動してディレクトリを起動moveします。

import shutil
import os

def move(destination, depth=None):
    if not depth:
        depth = []
    for file_or_dir in os.listdir(os.path.join([destination] + depth, os.sep)):
        if os.path.isfile(file_or_dir):
            shutil.move(file_or_dir, destination)
        else:
            move(destination, os.path.join(depth + [file_or_dir], os.sep))
于 2013-07-09T11:39:28.000 に答える
1
import os.path, shutil

def move(src, dest):
    not_in_dest = lambda x: os.path.samefile(x, dest)
    files_to_move = filter(not_in_dest,
                           glob_recursive(path=src))

    for f in files_to_move:
        shutil.move(f, dest)

ソースglob_recursive。衝突してもファイル名を変更しません。

samefileパスを比較する安全な方法です。ただし、Windows では動作しないため、Windows および Python 2.7 で os.path.samefile の動作をエミュレートする方法を確認してください。.

于 2013-07-09T12:16:53.460 に答える