LoginSignup
0
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-17

・今日の進捗
基本機能の確認として下図の処理を全部できるようにした。相変わらず細かいエラーが多い。
image.png
発生したミスを忘れないように書いておく
①大文字小文字はキッチリと。

入力
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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1