質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

6037閲覧

pythonで、ディレクトリごと、別のディレクトリへコピーしてみたい

HidenoriYamano

総合スコア60

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2015/06/15 07:33

編集2015/06/19 08:22

複数のディレクトリの中にあるすべてのファイルを、ある別のディレクトリにまとめる方法はありますか。shutilというモジュールのcopytreeという関数は、新しくディレクトリを作成するため、まとめることが出来ません。
いま、以下のスクリプトで、コピーできたのですが、一つずつファイルを移動しているため、時間がかかってしまいます。改善策を教えてください。

lang

1#-*- coding:utf-8 -*- 2import shutil 3import os 4 5#指定したパス内全てのディレクトリを取得 6lists1 = os.listdir('/Users/Desktop/old') 7 8for list1 in lists1: 9 #指定したパス内全てのファイルを取得 10 lists2 = os.listdir('/Users/tsuda/Desktop/origin/'+ list1) 11 12 for list2 in lists2: 13 oldpath = '/Users/tsuda/Desktop/origin/'+ list1 + '/' + list2 14 newpath = '/Users/new' 15 #oldpathファイルをnewpathディレクトリへコピー 16 shutil.copy(oldpath, newpath)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ディレクトリaにA1とA2,ディレクトリbにB1とB2があったとき,
新しいディレクトリcの中にA1,A2,B1,B2を入れたいということですよね?
それはpythonのコードうんぬんよりも,OSについての知識が必要かと思います.

全ファイルをコピーするならば,最終的には必ず1つずつコピーされることになります.
しかし単にあるディレクトリから別のディレクトリにあるファイルを参照したいならば,
リンクを張れば良いと思います.
ファイルの内容をコピーすること無く,別のディレクトリから参照することができるようになります.
Unix系のOS(Linux,Macなど)であれば「ln」コマンドを実行して,
ファイルの中身をコピーすること無くディレクトリcの中にA1などを配置することが出来ます.
以下Unix系のOSでの話になります.

ターミナル(端末)上でlnコマンドを使えば,

lang

1$ ln -s /a/* /c/

とするだけで,ディレクトリaの中にあるファイルやディレクトリをcの中に入れることが出来ます.

質問者の方からすると反則のように思われるかもしれませんが,
処理は得意な言語にやらせたほうが良いと思います.
Pythonのコードからコマンドを実行して結果を受け取るためには

lang

1#!/usr/bin/env python 2import commands 3check = commands.getoutput("ln -s /a/* /c/") 4print check

とすれば良いです.適宜関数の引数は変更してください.

PythonnのOSモジュール内のsymlinkを利用して,
単一ファイルについてシンボリックリンクを作る方法もありますが,
自分でディレクトリの探索をするコードを書かなくてはならないため少し面倒です.
(ワイルドカードの*が使えません)
どうしても,と言う場合はこちらをご覧ください.
python symlink vs ln - Stack Overflow

Windowsで同じようなことをしたい場合,MKLINKコマンドを使うか,
cygwin(Windows上でUnixのコマンドを実行するプログラム)上でこれらのコードを実行してみてください.
上手くいくかは確認していません.

投稿2015/06/16 09:23

KenTerada

総合スコア751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HidenoriYamano

2015/06/16 13:28

osがwindowsですので、mklinkコマンドを実行してみました。しかし、ファイr名、ディレクトリ名またはボリュームラベルの構文が間違っていますと表示され、うまくいきませんでした。また、mklinkのリンク元は、新しくフォルダを作成しないといけないため、リンク元に複数のディレクトリをリンクすることは難しそうです><
KenTerada

2015/06/17 04:26

普段Windowsをコマンドで操作することはなく,mklinkを試してみましたが確かにlnとの違いが大きく,目的を達成することができませんでした. ただし,ファイル本体をコピーせずに別ディレクトリから見られるようにする,という目的の達成にはシンボリックリンクが一番かと思います. 「Windows」かなにかのタグをつけて,Windowsコマンドやバッチファイルに詳しい人に聞いた方が良いと思います. お役に立てずすみません.
HidenoriYamano

2015/06/19 08:21

ご指摘ありがとうございます。タグ付けしておきます。
退会済みユーザー

退会済みユーザー

2015/07/13 03:34

PythonのShell系のモジュールは処理系によってやたら遅いことがあるそうですので、自分も、OSの得意な方法を利用する、という線で進めるのがベターだと思います。 Windowsの場合だと、XCOPYコマンドやrobocopyコマンドを使う形になると思います。 ※各コマンドの使い方については、検索していただくと良いかと思います。 ※コマンドはどちらも単独のプログラムなので、子プロセス起動で呼び出す形になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問