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

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

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

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

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

Q&A

解決済

3回答

6448閲覧

ファイルを(ファイル名と前半部分が一致する)フォルダへの移動

kuma07

総合スコア9

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

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

0グッド

1クリップ

投稿2021/06/23 11:46

pythons初心者です。
pythonでファイル名を(ファイル名と前半部分が一致する)フォルダへの移動をするコードを考えております。

【状況】
・未分類のフォルダ(下記のコードだと’invoice2'フォルダ)に分類前のPDF ファイルが格納されております
・PDFファイル名は「1001_aaa.pdf」,「2132_abcd.pdf」のように前半部分は「****_」の形式(数字4文字にアンダーバー)にしております
・分類先のフォルダは、フォルダ名が「1001_㈱××商事」、「2131_㈲×××」のようになっております
・(ファイル名の前半部分の数字4文字)と(フォルダ名の前半部分の数字4文字)が一致するものがあります

【実現したいこと】
・ファイル名の前半の数字4文字である「****」箇所と前半部分が一致するフォルダに格納したいです
・例だとファイル:「1001_aaa.pdf」をフォルダ名「1001_㈱××商事」に格納したいです

【実行したこと】
下記のようなコードを作成しました

import shutil import os #file名の取得 files=os.listdir('./ocr/invoice2') #fileを1つずつ取り出す for file in files: file_name=os.path.splitext(os.path.basename(file)) file_name=file_name[0] print(file_name) path1=f'./ocr/invoice2/{file_name}.pdf' path2=f'./ocr/invoice3/{file_name[:4]}/{file_name}.pdf' #ここがうまくいかない os.rename(path1,path2)

【うまくいかない理由(推定)】
・たとえばフォルダ名が「1001_㈱××商事」のフォルダを指定する際に
f'./ocr/invoice3/{file_name[:4]}/'
のようにしてますが、これだと フォルダ名が「1001」のようにしないとならないのかと思います。
そのため、  f'./ocr/invoice3/{file_name[:4]}+{*}/' のようにワイルドカードを利用してフォルダ名を指定しようと思いましたがうまくいきませんでした。

ネットなどで調べているのですが、うまい解決方法が見当たらないです。
アドバイスをもらえますと助かります

よろしくお願いいたします

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

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

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

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

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

guest

回答3

0

ベストアンサー

Pythonで条件を満たすパスの一覧を再帰的に取得するglobの使い方
glob --- Unix 形式のパス名のパターン展開

python

1# ディレクトリとファイル作成 2!mkdir 1101_商事 3!mkdir 2131_有限会社 4!mkdir ocr 5%cd ocr 6!mkdir invoice 7%cd /content 8!touch ocr/invoice/1101_1.pdf 9!touch ocr/invoice/2131_1.pdf 10 11# サンプルコード 12import glob 13import os 14 15files = glob.glob('./ocr/invoice/*.pdf') # ファイル一覧 16 17dirs = os.listdir() # ディレクトリ一覧 18 19for f in files: 20 filename = os.path.basename(f) 21 num = filename.split('_')[0] # ファイル名の先頭部分を抽出 22 for d in dirs: 23 if num in d: # ディレクトリの名前の先頭ととファイルの数字が一致した場合 24 os.rename(f,d+'/'+filename) # ファイル移動

Colaboratoryで実施しました。

こんな感じで、移動してみてはどうでしょうか?

投稿2021/06/23 13:40

toshikawa

総合スコア388

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

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

kuma07

2021/06/23 22:24

大変ありがとうございます。これがやりたかったことです。 このようなシンプルなコードが書きたいです。 大変勉強になりました。 また、よろしくお願いいたします。
guest

0

他の方の回答通りですが、

1001_abcde.pdf
2012_xyz.pdf

などとというファイルをそれぞれ

1001_あいうおえ
2012_かきくけこ

というフォルダに入れたいのですよね?

であれば、人間が手動でやる時にどうやって入れる先を決めるかですよね。
通常であれば、

ファイル名の先頭4桁を覚えて、フォルダ名の一覧を見て先頭4桁が合致するところに入れる。

とすると思いますので、これをそのままコードにすればいいかと思います。

投稿2021/06/23 12:09

udon-ken

総合スコア657

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

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

kuma07

2021/06/23 22:25

ありがとうございます。 考え方勉強になります。 またよろしくお願いいたします。
guest

0

  1. 前半部の文字列、というのをとってきておいて、
  2. フォルダ名のリストを取ってきて、
  3. そのリストから、その文字列で始まるものを探す、

というのをまず考えればどうでしょう

投稿2021/06/23 11:53

編集2021/06/23 11:54
y_waiwai

総合スコア87774

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

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

kuma07

2021/06/23 13:40

アドバイスありがとうございます。 アドバイスを踏まえて作成しましたら完成しました。 下記のようなコードにしましたが先生のイメージと違いましたら教えていただけますと助かります。 #フォルダ名のリスト d_namaes=os.listdir('./ocr/invoice3') mylist=[] for d_namae in d_namaes: mylist.append(d_namae) #フォルダ名のリスト #ファイル名の前半部分をとる files=os.listdir('./ocr/invoice2') for file in files: file_name=os.path.splitext(os.path.basename(file)) file_name=file_name[0] maeno_name=file_name[:4] #リストから文字列を含むものを探す for j in mylist: if maeno_name in j: path1=f'./ocr/invoice2/{file_name}.pdf' path2=f'./ocr/invoice3/{j}/{file_name}.pdf' os.rename(path1,path2)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問