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

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

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

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

Q&A

解決済

1回答

787閲覧

Python:ファイル名に含まれる任意の文字列を参照し、別ファイルのパスを取得したい

daichiddd

総合スコア9

Python

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

0グッド

0クリップ

投稿2021/10/13 07:08

前提・実現したいこと

Python初学者です。

<実現したいこと>
新しいVerのファイルが新Verフォルダに保存されます。そのファイルを旧Verのファイルの場所に移動、旧Verのファイルはバックアップフォルダに移動することを目標としたプログラムを考えています。ファイルはExcel形式で保存されています。

具体的には、ファイル名「---_Ver1.1.xlsx」を参照し、違うフォルダに入っている「---_Ver1.0.xlsx」ファイルのパスを取得することを実現したいです。
(---)は任意の文字列です。この(---)を参照して旧Verのファイルのパスを入手したいです。

 そのため、任意の文字列を参照し、その文字列が含まれているファイルの位置をサーチ、またそのファイルのパスを取得する方法があれば教えていただきたいです。

調べたところ、osモジュールからglobを使用して何かする感じなのかなと思いましたが、そこから手が止まってしまいました。

下にディレクトリ構造について記します。
初学者のため、皆様の力をお借りしたいです。
参考ページでも構いませんので、ぜひ回答の程よろしくお願いします。

ディレクトリ構造

temp ├── 新Verファイル仮置き場 │ ├── ---_Ver1.5.xlsx │ └── ^^^_Ver2.2.xlsx └── dir1 │ ├── dir3 │ └── ---_Ver1.4.xlsx └── dir2 └── dir4 │ ├── ^^^_Ver2.1.xlsx │ └── ***_Ver1.0.xlsx │ └── バックアップフォルダ ├── ---_Ver1.3.xlsx └── ^^^_Ver2.0.xlsx └── ・・・(今までのファイルが入っている)

上記の構造から実現したいことは、新Verファイル仮置き場から「---」、「^^^」を参照し部分一致したファイルでバックアップフォルダに入っていないファイルを探す。
「---_Ver1.5.xlsx」の場合、temp\dir1---_Ver1.4.xlsx が該当する。このファイルの位置に「---_Ver1.5.xlsx」を保存し、temp\dir1---Ver1.4.xlsx はバックアップフォルダに移動。
これを新Verファイル仮置き場が空になるまで処理を続ける。

この処理を終えたときのディレクトリ構造は下記の通りになる。

処理終了後のディレクトリ構造

temp ├── 新Verファイル仮置き場 └── dir1 │ ├── dir3 │ └── ---_Ver1.5.xlsx └── dir2 └── dir4 │ ├── ^^^_Ver2.2.xlsx │ └── ***_Ver1.0.xlsx │ └── バックアップフォルダ ├── ---_Ver1.3.xlsx ├── ^^^_Ver2.0.xlsx ├── ---_Ver1.4.xlsx ├── ^^^_Ver2.1.xlsx └── ・・・(今までのファイルが入っている)

試したこと

ここから全く手が動きません。色々調べていますがあまり納得のいくページが見つからないため、なにか参考になるページがあれば教えていただけると幸いです。

import glob import os path = r"C:\Users\temp\新Verファイル仮置き場" os.chdir(path) file_list = glob.glob('*.xlsx')

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

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

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

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

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

ppaul

2021/10/13 08:14

「---」を元に、ファイルのパスを見つける部分がわからないのでしょうか。 それとも、移動の方法が分からないのでしょうか。
daichiddd

2021/10/13 08:36

質問ありがとうございます。 ファイルのパスを見つける部分が今回お聞きしたい所です。
guest

回答1

0

ベストアンサー

以下です。

python

1from glob import glob 2def search(head, ext, root='.'): 3 return glob(f'{root}/**/{head}*.{ext}', recursive=True)) 4

headはファイルの開始文字列、extは拡張子、rootは探す基点となるディレクトリです。

投稿2021/10/13 08:41

編集2021/10/13 08:42
ppaul

総合スコア24666

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

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

daichiddd

2021/10/13 10:28 編集

回答ありがとうございます。上記のコードを試してみたのですが、'module' object is not callable とエラーをはいてしまいました。 以下の様に編集したのですが、これは正しいでしょうか。 ``` from glob import glob def search(head, ext, root='.'): return glob.glob(f'{root}/**/{head}*.{ext}', recursive=True) ```
daichiddd

2021/10/13 10:49

この関数でhead,extに該当するすべてのファイルのパスを取得することが可能になりました。 ありがとうございます。何か問題点あればご指摘のほどお願いいたします。 重ねて質問をして大変申し訳ないのですが、この関数を編集して旧Verのみのパスを取得するものをつくるとしたらどのようなものがあるでしょうか。(上記のディレクトリ構造を例に挙げると「---」をheadにした場合、「---_Ver1.4.xlsx」のみを取得できる) if文を使って「新Verファイル仮置き場」、「バックアップフォルダ」が含まれるパスを持つものは排除するような形式で大丈夫でしょうか。
ppaul

2021/10/13 11:06

os.path.basenameを使ってフォルダを除いたファイル名を取りだし、最新版と比較すれば良いでしょう。
daichiddd

2021/10/14 07:22

返信ありがとうございます。参考に致します。 最後になりますが、回答していただいたこの関数は {root} 以下のパスをすべて参照し、{head},{ext}の条件に該当するパスを取り出すものという解釈で合ってますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問