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

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

ただいまの
回答率

90.60%

  • Python

    7499questions

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

  • Excel

    1468questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

pythonでのexcelの操作について

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 3,957

u_k_statistics

score 36

pythonを使ってexcelデータを読み込み、そのデータをmysqlに入れたいのですが、最初の段階のデータの読み込みがうまくいきません。

import glob
import xlrd
files = glob.glob('/Users/xxx/xxxx/xxxxx/xxxxxx/*.xlsx')


book = xlrd.open_workbook(files[0])
sheet_1 = book.sheet_by_index(0)
for col in range(sheet_1.ncols):
    for row in range(sheet_1.nrows):
        items = sheet_1.cell(row,col).value

print items[1]

としても
IndexError: string index out of range
となってしまいます。
また
book = xlrd.open_workbook(files[0])
sheet_1 = book.sheet_by_index(0)
for col in range(sheet_1.ncols):
    for row in range(sheet_1.nrows):
        print sheet_1.cell(row,col).value

とすると値は返ってきます。
ただ、のちにmysqlにデータを入れたいのでitemsに値が入ってくれないと困ります><
どなたか解決策をご存知の方がいらっしゃいましたら、宜しくお願いしますm(__)m

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

おそらくですが、IndexError: string index out of range というエラーから

print items[1]
の行が間違っているように思います。
試しに以下のように書き換えてみてください。
print items[0]

それと
files = glob.glob('/Users/xxx/xxxx/xxxxx/xxxxxx/*.xlsx') 
の行で読み込んでいるファイルがxlsxなので、使うライブラリは openpyxl の方がいいと思います。

自分のUbuntuの環境で総務省が公開しているxlsxファイルを試しに読み込んでみましたが、ちゃんと動きました。
以下のような感じで読み込んで表示します。参考になれば幸いです。
wb = load_workbook('hoge.xlsx') # まずxlsxファイル(book)を読み込む。
ws = wb['sheet1'] # 次にシートを読み込みます。
print(ws['B4'].value) # B4セルの情報をコンソールに表示します。

ちなみに、Simple usage — openpyxl 2.2.4 documentationはページの一番上から順番に実行して動くものなので、断片的なコードを一つのコードとして追っていくと、処理が解ると思います :)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/29 13:21

    manzyunさん回答ありがとうございます。
    openpyxlを使おうと思い
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import glob

    from openpyxl import load_workbook
    files = glob.glob('/Users/xxx/xxxx/xxxxx/xxxxxx/*.xlsx')

    wb = load_workbook(filename=files[0])
    ws = wb.active
    x = ws.rows
    for u in x:
    for v in u:
    print v.value + '\t',

    としたのですが実行結果が

    File "excel_openpyxl.py", line 15, in <module>
    ws = wb.active
    AttributeError: 'Workbook' object has no attribute 'active'

    と出てしまいました。
    どうしたらいいのでしょうか?
    宜しくお願いします><

    キャンセル

  • 2015/07/29 16:43

    追記失礼します。
    macで作業しているのですがひょっとしてmacでは無理なのでしょうか?

    キャンセル

  • 2015/07/31 14:27

    回答を加筆しました。よろしければごらんください。

    キャンセル

  • 2015/08/03 12:27

    manzyunさんありがとうございます。
    おかげさまでデータを取得することができました。
    追加で質問で申し訳ないのですが、openpyxlでエクセルの列数や行数の取得方法を教えていただきたいです。xlrdだとncolsなどがあるのですがopenpyxlでは見つけられませんでした...
    流れとしては、すべてのセルのデータを取得してそれをmysqlに入れたいです。
    宜しくお願いします。

    キャンセル

  • 2015/08/04 22:34

    行数ならすぐに求められそうです。Worksheetクラスにmax_rowというメソッドがあるようです。
    ただ、列数はアルファベットで返されるので、処理にひと手間加えないと行けなさそうです。

    How do I check using openpyxl the number of rows with data in them without scanning all rows within the spreadsheet - Google グループ
    https://groups.google.com/forum/#!topic/openpyxl-users/fgf_qxW2OhA

    キャンセル

  • 2015/08/06 15:56

    manzyunさん
    何度も回答ありがとうございます><

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import glob
    from openpyxl import load_workbook
    from openpyxl.cell import get_column_letter
    files_p = glob.glob('xxxx/*.xlsx')

    for i in range(len(files_p)):
    wb = load_workbook(files_p[i],use_iterators=True)
    ws = wb['Sheet1']
    print ws.max_col

    のようにして実行すると
    print ws.max_col
    AttributeError: 'ReadOnlyWorksheet' object has no attribute 'max_col'
    と出てしまいます。
    しかし、使用しているxlsxファイルはすべての人が読み書きできるようになっています。
    なぜこのようなことが起こるのかご存知でしたら宜しくお願いします。

    キャンセル

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7499questions

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

  • Excel

    1468questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。