ネット偽善者でもいいじゃない

悩んでるなら面白いマンガ読もう

python3でExcelを読み込むのにurllib,xlrdを用いた

python3だとなんか違って少しだけ躓いた

下記サイトでpandasの使い方などを練習してたところ

ITエンジニアのためのデータサイエンティスト養成講座(3):データを取り込む・格納するための方法を理解する (1/4) - @IT

pythonのバージョンの違いなどでライブラリが違ったのでメモ

自分の環境は

python3.4..3 :: Anaconda 2.3.0

Mac OsX 10.9

です

ライブラリのインストール

必要なライブラリ

・urllib

・xlrd

python3にurllib2は無い

  

記事内ではurllib2を用いているが、python3系にそのライブラリは無く

urllibというライブラリを使うことになる

おそらくurllibはpythonに最初から入っているので

($ python で対話モードに入って import urllib してそのまま続けれたら入ってるって確認できます)   

     

また、xlrdというのは基本的にpipなどでインストールする必要がある

僕はanacondaを用いていたので最初からインストールされていましたが

入ってない場合は下記が参考になるかと

Excel ファイルを Python 3.2 で読む - potass' blog

urllibを使って動かしてみる

結論から言うと

socket = urllib2.urlopen(link)

ではなくて

socket = urllib.request.urlopen(link)

とすればよい

記事の4ページ目

ITエンジニアのためのデータサイエンティスト養成講座(3):データを取り込む・格納するための方法を理解する (4/4) - @IT

の、インターネット普及率の推移 のところをやってみようとして、ipythonで打ち込んでみる

socket = urllib2.urlopen(link)

のところはurllib2が使えないのでurllibで書き換えてみる

socket = urllib.urlopen(link)

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-cd2bac749346> in <module>()
----> 1 socket = urllib.urlopen(link)

AttributeError: 'module' object has no attribute 'urlopen'

moduleはそんなものもってませんって出る

じゃあどうやってopenするんだと思ってググってみると下記stackoverflowがヒットする

python - urllib "module object is not callable" - Stack Overflow

違う質問に関する記述だけど

どうやらオブジェクトとして呼び出す必要があるからって書かれてる

とりあえずURL呼び出せそうなのでこれで書きなおしてみる

ln [4]: socket = urllib.request.Request(link)
ln [5]: opener = urllib.request.build_opener()
ln [6]: response = opener.open(socket)

とすればちゃんといけました、が三行も書かないといけないの・・・?

と思ってドキュメント見たら一番上に載ってたちゃんと読めばよかった・・・orz

21.6. urllib.request — URL を開くための拡張可能なライブラリ — Python 3.3.6 ドキュメント

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False)

でやればurlopenできますよって書いてあった

ので、全体を書き直すと以下のようにすればできました解決

In [1]: import pandas as pd

In [2]: import urllib

In [3]: link = 'http://www.soumu.go.jp/johotsusintokei/field/data/gt010102.xls'

In [4]: socket = urllib.request.urlopen(link)

In [5]: xls = pd.ExcelFile(socket)

In [6]: df = xls.parse(xls.sheet_names[0], header=2, index_col=0, skip_footer=9)

In [7]: df.T

Out[7]: 
          世帯    個人 企業(従業者100人以上) 事業所(従業者5人以上)
平成9年末    6.4   9.2          68.2         12.3
平成10年末    11  13.4          63.8         19.2
平成11年末  19.1  21.4          78.3         31.8
平成12年末    34  37.1          89.3         44.8
平成13年末  60.5  46.3          94.5           68
平成14年末  81.4  57.8          96.3         79.1
平成15年末  88.1  64.3          97.9         82.6
平成16年末  86.8    66          98.7         81.8
平成17年末    87  70.8          97.6         85.7
平成18年末  79.3  72.6          98.8         85.6
平成19年末  91.3    73          99.3            -
平成20年末  91.1  75.3          99.3            -
平成21年末  92.7    78          99.9            -
平成22年末  93.8  78.2          99.7            -
平成23年末    86  79.1          99.3            -
平成24年末  86.2  79.5          99.9            -
平成25年末  84.9  82.8          99.9            -