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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Python

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

Q&A

解決済

2回答

193閲覧

shutil.moveで複数のファイルを移動するとき、移動先に同名のファイルがあって、それを上書きしたい

yyicp

総合スコア62

Python

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

1グッド

0クリップ

投稿2025/05/01 02:09

実現したいこと

「該当のソースコード」はtxtディレクトリが存在しないときは正しく動作します。すでにtxtディレクトリが存在して、その中にファイル(例えば1.txt)が存在するときに上書きするようにしたいです。ファイルの数は大量なので、globを使おうと思いました。色々ネットで調べましたが、よく分からないので教えてください。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "〇〇〇\testCV114-3.py", line 11, in <module> shutil.move(str(i), str(new_folder)) File "〇〇〇\Lib\shutil.py", line 884, in move raise Error("Destination path '%s' already exists" % real_dst) shutil.Error: Destination path 'txt\1.txt' already exists

該当のソースコード

こちらを参考にしました。

python

1import shutil 2import glob 3 4new_folder = 'txt' 5if not os.path.exists(new_folder): 6 os.mkdir(new_folder) 7 8files = glob.glob('*.txt') 9 10for i in files: 11 shutil.move(str(i), str(new_folder))

試したこと

「該当のソースコード」の3行目に以下の部分を入れると実現できますが、後でtxtoldというディレクトリを手動で消去する必要があります。もっときれいに実現するやり方があると思って質問させていただきました。

python

1import os 2oldpath = './txt' 3newpath = './txtold' 4os.rename(oldpath, newpath)
melian👍を押しています

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

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

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

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

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

bsdfan

2025/05/01 12:37

解決済みですが、 shutil.move(ファイル名, ディレクトリ名) ではなく shutil.move(ファイル名, ディレクトリ名 + '/' + ファイル名) にしたら上書きされると思います。(os.path.join のほうがいいかもしれません)
yyicp

2025/05/02 00:44

>bsdfan様 コメントありがとうございます。 今回はglobを使ってのやり方が分からなかったので質問させていただきました。
bsdfan

2025/05/02 01:16

globは無関係で、shutil.move は第二引数がファイル名のときと、ディレクトリ名の時で動作が変わるので、上のコメントをしました。 shutil.move(str(i), str(new_folder)) を shutil.move(i, new_folder + '/' + i) にすればいいのでは、ということです。
yyicp

2025/05/02 01:40

できました。 どうもありがとうございました。
guest

回答2

0

処理ん仕様として、移動先のディレクトリに存在するが、移動対象には無いファイルはどうするのかがわかりませんが、以下のような処理はどうでしょうか。

案1. moveする前に同名のファイルがあるか確認し、あれば消す。
※ この案だと、移動対象になかったファイルは上書きせずに残ります。

案2. 「試したこと」にでてくるディレクトリをスクリプトで消す。
※ そもそも名前を変えたあとに消すのであれば、はじめから消してしまえばいいですがね。

投稿2025/05/01 03:04

TakaiY

総合スコア14286

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

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

yyicp

2025/05/01 04:07

コメントありがとうございました。 melian様の方法で解決しました。(案1)
guest

0

ベストアンサー

Pathlib モジュールの rename() メソッドの場合、ファイルが既に存在する場合には既存のファイルを上書きします。
※ Windows 環境ではエラー(FileExistsError: [WinError 183] )が発生するので、Pathlib.Path.unlink() で当該のファイルを削除してから rename() を実行します。

python

1from pathlib import Path 2 3new_folder = Path('txt') 4new_folder.mkdir(exist_ok=True) 5 6files = Path('.').glob('*.txt') 7for i in files: 8 new_path = new_folder / i 9 new_path.unlink(missing_ok=True) 10 i.rename(new_path)

投稿2025/05/01 02:29

編集2025/05/01 03:32
melian

総合スコア21118

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

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

yyicp

2025/05/01 02:51

ご回答ありがとうございます。 教えていただいたコードでも、うまくいきませんでした。 ① testCV114-3.py、1.txtがある状態で、testCV114-3.pyを実行 ② txtディレクトリが生成され、その中に1.txtが入っている ③ 仮想的に上書きする状態を作るために、1.txtをtestCV114-3.pyが入っているフォルダにコピーする ④ testCV114-3.pyを実行 を実行すると、以下のようなエラーが出てしまいました。 Traceback (most recent call last): File "〇〇〇\testCV114-3.py", line 8, in <module> i.rename(new_folder / i) File "〇〇〇\Python312\Lib\pathlib.py", line 1363, in rename os.rename(self, target) FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: '1.txt' -> 'txt\\1.txt' 何か勘違い、変なことをやっていたら申し訳ありません。
melian

2025/05/01 03:07

手元の環境は Ubuntu Linux なのですが、同様の状況でエラーは発生しません。Windows特有の挙動かと思いますが少し調べてみます。
yyicp

2025/05/01 04:04

できました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問