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

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

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

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

Q&A

解決済

1回答

1131閲覧

pythonでのソースコードの書き方について

yutaka_1213

総合スコア7

Python 3.x

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

0グッド

0クリップ

投稿2018/01/24 02:36

前提・実現したいこと

python3.7でプログラムの勉強をしています。
Python 3.7 (64-bit)のコマンドの画面を使って
ファイル名の変更するようなものを書いてみたのですが、
もっとコンパクトに書けますでしょうか。
また、関数にしたり、例外に関して記述してあるようなサイトが
あれば教えていただけないでしょうか。

■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

該当のソースコード

python

1import os 2import glob 3print(os.getcwd()) 4os.chdir(r"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") 5print(os.getcwd()) 6os.listdir(os.getcwd()) 7files=glob.glob('*.pdf') 8for oldname in files: 9 if '-1' in oldname[-6:]: 10 if oldname.count('-1') == 2: 11 newname=oldname.replace('-1','',2) 12 os.rename(oldname,newname) 13 elif oldname.count('-1') == 1: 14 newname=oldname.replace('-1','',1) 15 os.rename(oldname,newname) 16 if '-2' in oldname[-6:]: 17 if oldname.count('-2') == 2: 18 newname=oldname.replace('-2','',2) 19 os.rename(oldname,newname) 20 elif oldname.count('-2') == 1: 21 newname=oldname.replace('2','',1) 22 os.rename(oldname,newname) 23 if '-3' in oldname[-6:]: 24 if oldname.count('-3') == 2: 25 newname=oldname.replace('-3','',2) 26 os.rename(oldname,newname) 27 elif oldname.count('-3') == 1: 28 newname=oldname.replace('-3','',1) 29 os.rename(oldname,newname) 30 31

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

どういう入力データ(ファイル名)をどのように加工して出力(変更)したいかを(プログラムの仕様と制約事項)を質問文に記載すると、もっとよい回答がつきやすくなります。

考え方のヒントだけ。
1,3回同じコードを記述したら関数化できないかを考えてみてくださいな。
今回の場合は以下の箇所です。

Python

1 if '-1' in oldname[-6:]: 2 if oldname.count('-1') == 2: 3 newname=oldname.replace('-1','',2) 4 os.rename(oldname,newname) 5 elif oldname.count('-1') == 1: 6 newname=oldname.replace('-1','',1) 7 os.rename(oldname,newname) 8 if '-2' in oldname[-6:]: 9 if oldname.count('-2') == 2: 10 newname=oldname.replace('-2','',2) 11 os.rename(oldname,newname) 12 elif oldname.count('-2') == 1: 13 newname=oldname.replace('2','',1) 14 os.rename(oldname,newname) 15 if '-3' in oldname[-6:]: 16 if oldname.count('-3') == 2: 17 newname=oldname.replace('-3','',2) 18 os.rename(oldname,newname) 19 elif oldname.count('-3') == 1: 20 newname=oldname.replace('-3','',1) 21 os.rename(oldname,newname)

2,os.listdir(os.getcwd())の戻り値を使っていないように見えますが、使っていない場合はos.listdirの呼び出し自体が不要なためソースコードから削除してくださいな。
3,glob.globglob.iglobの呼び出しに変更して、イテレータを返す形にしてください。
4,ファイルパスの操作はpathlibライブラリを使うとシンプルにコードを記述できる事が多いです。
5,windowsの場合はos.renameはアトミック操作ではないため、os.replaceを使ってください。

投稿2018/01/24 03:10

編集2018/01/24 03:14
umyu

総合スコア5846

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

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

yutaka_1213

2018/01/24 04:10

ありがとうございます。 コメントの内容、いろいろ調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問