🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Python

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

Q&A

解決済

3回答

6190閲覧

フォルダ及びファイルの名前の最大値を抜き出して管理したい

SILASSETH

総合スコア7

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Python

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

0グッド

0クリップ

投稿2019/10/27 07:14

編集2019/10/27 09:42

[]はフォルダです。

A:\というフォルダ内に
[data]
data.mp4

Bというフォルダ内に

[data-01]
[data-02]
[data-03]
data-01.mp4
data-02.mp4
data-03.mp4

という構造の時に

A内の[data]とdata.mp4を
[data-04]
data-04.mp4
にリネームしてBに移動するプログラムを書きたいのです。

リネームする-??の数値は、B内に数あるdata-??の最大値に+1してリネームされるようにしたいです。

なお、名前のdataの部分は他のプログラムとの兼ね合いがあるので、いじらない形で管理したいです。

リネームも移動も書けるのですが、フォルダリストから最大値を抜き出すという段階でつまづいてしまいました。

追記及び修正

python

1import shutil 2import os 3from pathlib import Path 4 5output_dir = Path("A:/output") 6input_dir = Path("A:/input") 7 8dataList = [] 9 10for path in output_dir.glob('*.*'): 11 dataName = path.name.split("-")[1] 12 dataNumber = os.path.splitext(dataName)[0] 13 14 dataList.append(dataNumber) 15 16RenameNumber = int(max(dataList)) + 1 17RenameNumberName = 'data-' + str(RenameNumber).zfill(2) 18 19shutil.move(str(input_dir) + "/data.txt", str(output_dir) + "/" + RenameNumberName + ".txt") 20shutil.move(str(input_dir) + "/data", str(output_dir) + "/" + RenameNumberName ) 21

以上でなんとか動くようにはなりました…。

質問は2点です。
①上記コードの綺麗な書き方
②上記コードでinput_dirにpathを書いているのですが、実際はこのpyファイルの実行場所を取得したいので、その書き方

よろしくお願い致します。

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

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

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

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

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

meg_

2019/10/27 07:45

複数の数字の中から最大値を求めることは出来ますか?
guest

回答3

0

ベストアンサー

①上記コードの綺麗な書き方

綺麗かどうかは微妙ですが、こんな感じでしょうか。

  • できるだけpathlibの機能だけを使う
  • globパターンの記述は決め打てる限り詳細に
  • 変数の名前はPythonの慣習に従って lower_snake に統一
  • 読める範囲(個人差有り)で内包表記やジェネレータ式を積極的に使う

Python

1import pathlib 2 3 4output_dir = pathlib.Path(r'A:\output') 5input_dir = pathlib.Path(r'A:\input') 6 7# 0123456789 8# data-XX.mp4 9new_num = 1 + max( 10 int(n) for n in map( 11 lambda p: p.stem[5:], output_dir.glob('data-[0-9][0-9].mp4') 12 ) 13) 14 15(input_dir / 'data.mp4').rename( 16 output_dir / f'data-{new_num:02d}.mp4' 17) 18(input_dir / 'data').rename( 19 output_dir / f'data-{new_num:02d}' 20)

正しく動作する保証は無いので、ダミーデータを使うか/コピーを取ってから試してみて下さい。


②上記コードでinput_dirにpathを書いているのですが、実際はこのpyファイルの実行場所を取得したいので、その書き方

  • カレントディレクトリという意味なら

input_dir = pathlib.Path('.')

  • 実行ファイルのあるディレクトリという意味なら

input_dir = pathlib.Path(__file__).parent

投稿2019/10/27 23:37

LouiS0616

総合スコア35668

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

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

SILASSETH

2019/10/28 10:29

ありがとうございます。勉強になります。
guest

0

たんに01から始めて、一致したファイル名があれば、数字を+1して、一致したファイルが存在しなくなるまで繰り返せばいいだけでは

投稿2019/10/27 13:36

y_waiwai

総合スコア88038

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

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

SILASSETH

2019/10/27 22:42

こんな感じで書いてみたのですが、このコードは間違っており動きません…。 x = 1 for F in os.path.exists( str(output_dir) + "/" + 'data-' + str(x).zfill(2) +'.txt') : if os.path.exists( str(output_dir) + "/" + 'data-' + str(x).zfill(2) +'.txt') : x = int(x) +1 continue else: 移動リネーム break for F in os.path.exists( str(output_dir) + "/" + 'data-' + str(x).zfill(2) +'.txt') : の部分の書き方が分からないので、アドバイスいただきたいです。
y_waiwai

2019/10/27 23:36

x=1 while true: fname=ファイル名生成 if not os.path.exist(fname) : break x++; というふーにして、fnameをプリントするなりしてどういう内容になってるのか確認してみよう
SILASSETH

2019/10/28 10:28

無事動くコードが書けました。ありがとうございます。
guest

0

①上記コードの綺麗な書き方

特に問題ないと思います。
強いて言えば、

Python

1RenameNumberName = f'data-{RenameNumber:02}'

でしょうか。
あと、splitextを先にやってからsplitをするほうが自然でしょう。

実際はこのpyファイルの実行場所を取得したい

「このpyファイルの格納場所」ですよね?

Python

1input_dir = Path(os.path.dirname(__file__))

です。

投稿2019/10/27 15:38

otn

総合スコア85888

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

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

SILASSETH

2019/10/27 22:43

ありがとうございます。無事、思い通りの処理ができるようになった上、勉強にもなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問