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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

Q&A

解決済

1回答

1108閲覧

xlsxからcsvの出力で、PermissionError対策用のコードが起動しない

maltines

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

0グッド

0クリップ

投稿2021/08/13 07:07

編集2021/08/13 08:01

プログラミング初心者です。

【Excel×Python最速仕事術】という本を読み、今VSCode上でPythonを動かしています。

現在この本のChapter3に差し掛かったところで、フォルダ内の複数のxlsxファイルをcsvに出力するコードを勉強しています。(この本で使っているサンプルファイルはこちらから登録後ダウンロードできます。現在使っているのは、\excel_python\03\python_prg です。)

まず、下記のコードを実行した結果成功し、xlsxファイルがあるフォルダにcsvファイルが出力されました。

python

1import pathlib # 標準ライブラリ 2import openpyxl # 外部ライブラリ pip install openpyxl 3import csv # 標準ライブラリ 4 5 6lwb = openpyxl.Workbook() #売上一覧表ワークブック 7lsh = lwb.active #売上一覧表ワークシート 8list_row = 1 9path = pathlib.Path("..\data\sales") #相対パス指定 10for pass_obj in path.iterdir(): 11 if pass_obj.match("*.xlsx"): 12 wb = openpyxl.load_workbook(pass_obj) 13 for sh in wb: 14 for dt_row in range(9,19): 15 if sh.cell(dt_row, 2).value != None: 16 #より説明的なコード 17 #lsh.cell(row=list_row, column=1).value = \ 18 # sh.cell(row=2, column=7).value #伝票NO 19 lsh.cell(list_row, 1).value = sh.cell(2, 7).value #伝票NO 20 lsh.cell(list_row, 2).value = sh.cell(3, 7).value #日付 21 lsh.cell(list_row, 3).value = sh.cell(4, 3).value #得意先コード 22 lsh.cell(list_row, 4).value = sh.cell(7, 8).value #担当者コード 23 lsh.cell(list_row, 5).value = sh.cell(dt_row, 1).value #No 24 lsh.cell(list_row, 6).value = sh.cell(dt_row, 2).value #商品コード 25 lsh.cell(list_row, 7).value = sh.cell(dt_row, 3).value #商品名 26 lsh.cell(list_row, 8).value = sh.cell(dt_row, 4).value #数量 27 lsh.cell(list_row, 9).value = sh.cell(dt_row, 5).value #単価 28 lsh.cell(list_row, 10).value = sh.cell(dt_row, 4).value * \ 29 sh.cell(dt_row, 5).value #金額 30 lsh.cell(list_row, 11).value = sh.cell(dt_row, 7).value #備考 31 list_row += 1 32 33#lwb.save("..\data\sales\salesList.xlsx") 34with open("..\data\sales\salesList.csv","w",encoding="utf_8_sig") as fp: 35 writer = csv.writer(fp, lineterminator="\n") 36 for row in lsh.rows: 37 writer.writerow([col.value for col in row]) 38

次に、PermissionErrorの対策のため、以下のコードが紹介されました。

python

1import pathlib 2import openpyxl 3import csv 4 5try: 6 lwb = openpyxl.Workbook() 7 lsh = lwb.active 8 list_row = 1 9 path = pathlib.Path("z:\data\sales") 10 for pass_obj in path.iterdir(): 11 if pass_obj.match("*.xlsx"): 12 wb = openpyxl.load_workbook(pass_obj) 13 for sh in wb: 14 for dt_row in range(9,19): 15 if sh.cell(dt_row, 2).value != None: 16 lsh.cell(list_row, 1).value = sh.cell(2, 7).value 17 lsh.cell(list_row, 2).value = sh.cell(3, 7).value 18 lsh.cell(list_row, 3).value = sh.cell(4, 3).value 19 lsh.cell(list_row, 4).value = sh.cell(7, 8).value 20 lsh.cell(list_row, 5).value = sh.cell(dt_row, 1).value 21 lsh.cell(list_row, 6).value = sh.cell(dt_row, 2).value 22 lsh.cell(list_row, 7).value = sh.cell(dt_row, 3).value 23 lsh.cell(list_row, 8).value = sh.cell(dt_row, 4).value 24 lsh.cell(list_row, 9).value = sh.cell(dt_row, 5).value 25 lsh.cell(list_row, 10).value = sh.cell(dt_row, 4).value * \ 26 sh.cell(dt_row, 5).value 27 lsh.cell(list_row, 11).value = sh.cell(dt_row, 7).value 28 list_row += 1 29 30 with open("z:\data\sales\salesList.csv","w",encoding="utf_8_sig") as fp: 31 writer = csv.writer(fp, lineterminator="\n") 32 for row in lsh.rows: 33 writer.writerow([col.value for col in row]) 34except PermissionError as ex: 35 print(ex.filename,"がPermissionエラーです") 36except: 37 print("例外が発生しました")

本によると、五行目にtryを追加し、例外を監視するコードをくくったとのことです。もしPermissionErrorが発生した場合、それ以外のエラーの場合でターミナルにエラーメッセージが出力されるように作られたらしいです。

確かに、ファイルを開いたまま一つ目のコードを実行するとPermissionErrorが出ます。

しかし、ファイルを開いたまま二つ目のコードを実行すると、「例外が発生しました」と出力され、PermissionErrorが認識されていないようです。試しにファイルを開かず二つ目のコードを実行するとまた「例外が発生しました」と出力され、一つ目のコードのようにcsvファイルは出力されず、コードが上手く機能していないようです。

二つ目のコードは何処に問題があるのでしょうか。ご回答宜しくお願い致します。

【追記】
普通に2つ目のコードが読み込めた方もいらっしゃった様です。そうなるとPython環境が原因なのかと考えたのですが、tryだけ組み込むとエラーになる原因が何なのか分かりません。

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

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

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

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

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

meg_

2021/08/13 07:18

> しかし、ファイルを開いたまま二つ目のコードを実行すると、「例外が発生しました」と出力され、PermissionErrorが認識されていないようです。試しにファイルを開かず二つ目のコードを実行するとまた「例外が発生しました」と出力され、一つ目のコードのようにcsvファイルは出力されず、コードが上手く機能していないようです。 質問のコードを試したところ正しく動作しました。一度Excelやpython環境を再起動して試しても駄目でしょうか?
maltines

2021/08/13 07:58

始めたばかりですので稚拙な質問で申し訳ございませんが、Python環境を再起動というのは、端末の再起動か、ファイルやフォルダを閉じることなのか、ウィンドウを閉じることなのか、それとも他の方法か、どれなのでしょうか?一応全て試しましたが変わりませんでした。 tryとexpectを組み込むと出来なくなるというのは何が原因なのかまったく分からないのです…
Alma-field

2021/08/13 08:01

except: print("例外が発生しました") の2行をコメントアウトして実際のエラーを確認してみてはいかがでしょうか
maltines

2021/08/13 08:50

解決しました!ありがとうございます! path = pathlib.Path("..\data\sales") の部分が path = pathlib.Path("z:\data\sales") に本の説明の関係で書き換えられていたのが原因だったようです。 Alma-fieldさんのご指摘通りにすると、FileNotFoundErrorが検出され、原因が分かりました。
guest

回答1

0

自己解決

Alma-fieldさんから、

except:
print("例外が発生しました")

の2行をコメントアウトして実際のエラーを確認するしてはどうかと助言があり、これを実行すると、FileNotFoundErrorが検出され、原因が分かりました。ありがとうございました。

path = pathlib.Path("..\data\sales")
の部分が
path = pathlib.Path("z:\data\sales")
に本の説明の関係で書き換えられていたのが原因だったようです。

投稿2021/08/13 08:58

maltines

総合スコア12

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

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

otn

2021/08/13 09:42

> except: > print("例外が発生しました") 例外をキャッチする練習プログラムなら良いですが、普通はこんなこと(全ての例外をキャッチして、握りつぶす)は書かないでしょう。 削除したままにしましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問