2017-05-05 8 views
0

こんにちは私はいくつかのフォルダリストから多くのフォルダを他のフォルダリストに移動またはコピーしたいですか?globshutilライブラリを使用しています。pythonを使用してフォルダリストから他のフォルダリストにフォルダを移動

import glob 

#paths from source folder 
sourcepath='C:/my/store/path/*' 
paths = glob.glob(sourcepath) 
my_file='10' 
selected_path = filter(lambda x: my_file in x, paths) 
#paths from destination folder 
destpath='C:/my/store/path/*' 
paths2 = glob.glob(destpath) 
my_file1='20' 
selected_path1 = filter(lambda x: my_file1 in x, paths2) 

、今私は

は今、私は映画にしたいか、最初のリスト(selected_path)からフォルダをコピーパスから、二つのリスト(selected_pa​​th、selected_pa​​th1)を持っている:

は、最初に私はフォルダリストを作成します第二のリスト(selected_path1

finaly私は成功せず、フォルダを移動するには、このコードを試してみてください。

import shutil 
for I,j in zip(selected_path,selected_path1) 
    shutil.move(i, j) 

しかし、その作業はできません、どのideどのように私のコードを動作させるには?

+0

「ラムダ」機能で何を達成しようとしていますか? 'glob'関数からすぐにパスをフィルタリングすることができます。 – direprobs

+0

@direprobsこれは問題ではありません。問題は 'shutil.move(i、j)' –

答えて

1

最初に、明らかにlambdaの使用は役に立たず、glob関数はこのフィルタリングを実行できます。これはglobが実際に行うことなので、基本的にコードを不要な関数呼び出しで浪費しているため、パフォーマンス面でかなり高価です。あなたと同じで、この例では

見て、:

import glob 

# Find all .py files 
sourcepath= 'C:/my/store/path/*.py' 
paths = glob.glob(sourcepath) 

# Find files that end with 'codes' 
destpath= 'C:/my/store/path/*codes' 
paths2 = glob.glob(destpath) 

第二に、第二glob関数呼び出したりしてもよいないにあなたのディレクトリ/ファイルを移動するディレクトリのリストを返します。これにより、あなたのコードはC:/ my/store/path contains. That is, you must guarantee that 'C:/my/store/pathにディレクトリと決してファイルのみを含まなければならないので、globshutil.moveで使用されるディレクトリだけを返します。後でユーザーが「C:/ my/store/path」という名前のファイルで、「codes」という名前で終了し、拡張子を指定しなかった場合(たとえばcodes.txt、codes.py ...)返されたglobのリストのファイルはpaths2にあります。もちろん、サブディレクトリだけを格納するディレクトリを保証することは問題であり、まったく良い考えではありません。あなたは、あなたが、filterにあなたの最初の呼び出しでは、あなたがglob自体では達成することができます何かを10が含まれていない任意の文字列をフィルタリングするためにfilterの助けを借りてlambdaを使用しているos.path.isdir

お知らせ何かを通じてディレクトリをテストすることができます:

glob.glob('C:/my/store/path/*10*') 

は今すぐ任意のファイルまたはCのサブディレクトリ:/私/店舗/パス名に10が含まれている glob関数の戻りリストに収集することができるでしょう。

第3に、zipは、引数リストの中で最短のiterableに切り捨てられます。言い換えれば、あなたはpaths2pathsへのすべてのパスにごとパスを移動したい場合、あなたはlen(paths) == len(paths2)がそうpaths内の各ファイルまたはディレクトリがpaths2にまで移動するdirectoryを持っている必要があります。

第四に、あなたはforループのために、あなたがi代わりのIを使用shutil.moveの呼び出しにセミコロンを逃しました。Pythonは大文字と小文字が区別言語であり、I大文字がi小文字とまったく同じではありません。

import shutil 
for I,j in zip(selected_path,selected_path1)   # missing : 
    shutil.move(i, j)         # i not I 

修正されたコード:

import shutil 
for I,j in zip(selected_path,selected_path1)   # missing : 
    shutil.move(I, j)         # i not I 

おそらく、paths2はCのサブディレクトリのみが含まれています/私/店舗/パスディレクトリが、これは間違いなくないあなたのコードを書くためのより良いアプローチですが、最高:

import glob 

#paths from source folder 
sourcepath='C:/my/store/path/*10*' 
paths = glob.glob(sourcepath) 

#paths from destination folder 
destpath='C:/my/store/path/*20*' 
paths2 = glob.glob(destpath) 

import shutil 
for i,j in zip(paths,paths2): 
    shutil.move(i, j) 

*上記の問題のいくつかは、このコードにも適用されます。

あなたはこの回答を読んで長いマラソンを終えたので、コードを改善するために何をしたいですか?あなたがまだ曖昧なものを見つけたら、私は喜んで助けてくれるでしょう。

幸運にも:)

+0

です。あなたは正常に動作していますが、 'shutil.mobi'ではなく' shutil.copy'を使用すると ' IOError:[Errno 13]許可が拒否されました:「何らかの理由で ? –

+0

@jessie jes 'shutil.move'は、OSの適切な特権なしでファイルを移動しようとすると、実際には同じ例外が発生します。あなたは正しい権限なしでタスクを実行しようとしているので 'Permission denied'例外が発生します。管理者としてcmdを実行することは解決策になります。 – direprobs

+0

あなたの助けを求める –

関連する問題