備忘録(①csv.readerのAttributeError、②get_sheet_by_nameのDeprecationWarning、③.delete_colsが機能しない)


・今日の進捗
基本機能の確認として下図の処理を全部できるようにした。相変わらず細かいエラーが多い。

発生したミスを忘れないように書いておく
①大文字小文字はキッチリと。

入力
import csv
csvfile = open('/content/drive/My Drive/Colab Notebooks/testB.csv',encoding="shift-jis")
reader = csv.Reader(csvfile)
for row in reader:
print(row) 
出力
AttributeError                            Traceback (most recent call last)
<ipython-input-14-bb1b8be4844f> in <module>()
      3 csvfile = open('/content/drive/My Drive/Colab Notebooks/testB.csv',encoding="shift-jis") 
----> 4 reader = csv.Reader(csvfile)
      5 for row in reader:
AttributeError: module 'csv' has no attribute 'Reader'

csv.reader()csv.Reader() 、大文字小文字を間違えたのでAttribute Errorが発生。
csv.DictReaderから書き換えた時に頻発しそうなので覚えておく

②get_sheet_by_nameは使わないほうがいい

入力
import openpyxl
wb=openpyxl.load_workbook('/content/drive/My Drive/Colab Notebooks/testB.xlsx')
wb.get_sheet_names()
出力
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:3: DeprecationWarning: 
 Call to deprecated function get_sheet_names (Use wb.sheetnames).
  This is separate from the ipykernel package so we can avoid doing imports until
['Sheet1']

Deprecationは非推奨という意味。機能はするけどあんま良くないので使うなってことらしく、更に推奨の関数も書いてある。
言われてみれば分かりやすいが、バーっと出てきた文字列を見て「は?なんで?」ってなって無駄に時間を使った。
ちゃんと英語は読まないとダメだね、本当に・・・。

③ hogehoge.delete_cols コマンドのhogehogeの部分は変数名である

入力(修正前)
import openpyxl
wb=openpyxl.load_workbook('/content/drive/My Drive/Colab Notebooks/testB.xlsx')
ws = wb.worksheets[0]
sheet.delete_cols(2)
wb.save('/content/drive/My Drive/Colab Notebooks/testC.xlsx')

ファイルは出力されたが、エクセルの2列目が削除できていなかった。
今見ると、色々なサイトをツマミ食いして完全におかしくなっている。

入力(修正後)
import openpyxl
wb=openpyxl.load_workbook('/content/drive/My Drive/Colab Notebooks/testB.xlsx')
ws = wb.worksheets[0]
ws.delete_cols(2)
wb.save('/content/drive/My Drive/Colab Notebooks/testC.xlsx')

wb=openpyxl.load_workbook() で、xlsxのデータを変数wbに詰め込む
ws=wb.worksheets[0] で、wbの中のxlsxのデータから引数(0)頁目のワークシートのデータを変数wsに詰め込む
ws.delete.cols(2) で、ワークシートのデータwsに対し、列数2列目(引数)を削除する
wb.save() で保存して成功・・・あれ?

最終的に出力されたtestC.xlsxはちゃんと2列めが消えたデータになるのだが、何故だろう?
wsのデータはwbからコピーしてきたものなので、wb.saveをする前に、wbにwsのデータを戻さないと本当はダメな気がする。
ws=wb.worksheets[]を使った時点で、wsとwbのデータが同期しているんだろうか・・・?
調べて分からなければ、質問を書いてみるか・・・?

~~追記~~
配列は参照される、という回答をいただけたのリンクを貼付。
https://qiita.com/wellwell3176/questions/d42efcba6482528e1556