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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

6073閲覧

Pythonにおけるファイルのコピーとリネームの同時実行

MagMag

総合スコア80

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/05/10 05:30

以下のように、ディレクトリ名とファイル名に基づいて、ファイルを1つのディレクトリに
コピー(移動)したいのですが、Pythonでどのように実装したらいいでしょうか?

'''現在(4000ファイル程度。スクリプトファイルは親ディレクトリに設置)
./TEXT1/AA/1.txt
./TEXT1/BB/2.txt
./TEXT1/BB/3.txt
./TEXT2/CC/1X.txt
'''

'''移動とリネーム後
./NEW_TEXT/AA1.txt
./NEW_TEXT/BB2.txt
./NEW_TEXT/BB2.txt
./NEW_TEXT/CC1X.txt
'''

os.copyとos.renameがあるのは把握しているのですが、
for文で回す時にコピーする際、ディレクトリ名を引用してファイルを同時にリネームする方法がわかりませんでした。お力添えいただけたら幸いです。

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

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

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

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

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

guest

回答3

0

Pythonなど不要。そう、シェル芸ならね!

bash

1$ find . -type f -name '*.txt'|sed -n -E 's|./[^/]+/([^/]+)/([^/]+.txt)|cp -p & ./NEW_TEXT/\1\2|p' 2cp -p ./TEXT1/AA/1.txt ./NEW_TEXT/AA1.txt 3cp -p ./TEXT1/BB/2.txt ./NEW_TEXT/BB2.txt 4cp -p ./TEXT1/BB/3.txt ./NEW_TEXT/BB3.txt 5cp -p ./TEXT2/CC/1X.txt ./NEW_TEXT/CC1X.txt 6$ !!|sh

投稿2018/05/10 09:34

hichon

総合スコア5737

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

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

0

Rubyだったらサクッと書けるんですが・・・

Ruby

1require 'fileutils' 2 3files = Dir.glob("./TEXT*/*/*.txt") 4files.each do |f| 5 /TEXT.*?/(.*?)/(.*).txt/ =~ f 6 after = "./NEW_TEXT/#{$~[1]}#{$~[2]}.txt" 7 FileUtils.mv f, after 8end

Pythonでも行けました。

Python

1import re 2import glob 3import shutil 4 5files = glob.glob("./TEXT*/*/*.txt") 6for f in files: 7 m = re.match(r"./TEXT.*?/(.*?)/(.*).txt", f) 8 after = "./NEW_TEXT/{0}{1}.txt".format(m.group(1), m.group(2)) 9 shutil.copy(f, after)

投稿2018/05/10 05:47

編集2018/05/10 06:09
kazto

総合スコア7196

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

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

MagMag

2018/05/15 06:38

ありがとうございました!
guest

0

ベストアンサー

とりあえずglob.globでコピー元ファイルのパスのリストでも作ってください。

Pythonでフォルダ内のファイルリストを取得する - Qiita

宛先ファイル名は、まあos.pathとかに色々あるといえばありますが、とりあえず簡単にやりたいのなら文字列加工でこんな感じで作れば良いんじゃないでしょうか。

python

1>>> "./NEW_TEXT/"+"".join("./TEXT1/AA/1.txt".split("/")[-2:]) 2'./NEW_TEXT/AA1.txt'

あとはコピー元ファイルパスのリストをforで回して、os.copyすればよいのでしょう。

投稿2018/05/10 05:41

hayataka2049

総合スコア30933

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

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

MagMag

2018/05/15 06:39

ありがとうございました。正規表現がわからない自分でも実装ができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問