プログラミング初心者です。
【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だけ組み込むとエラーになる原因が何なのか分かりません。
回答1件
あなたの回答
tips
プレビュー