🐍

PythonでWeb上のテキストファイルを読み込んで処理する

2022/02/21に公開

1. モチベーション

Pythonでローカルやサーバなどに保管されたテキストファイルを読み込んで操作する場合は open 関数を使うことが多く、ネット上の情報も多数ある。
Web上に存在する情報を取り扱う場合、多くはhtmlファイルの操作となる。このため、urllib.requestrequests、Beautiful Soup 4(bs4)等を使ったhtmlファイル上の情報のparseが良く知られている。
一方、Web上に存在する古い情報の中には、希にプレーンなテキストファイルで提供されているものがある。しかし、これらのテキストファイルをWebから直接requests等で取り扱う方法に関する情報は多くない。

テキストファイルをダウンロードして取り扱うことも可能だが、ダウンロード後のファイル処理などが面倒になると考え、urllib.request.urlopen で下記を実施することにした。

2. やったこと

ダウンロード後に処理する際の例:

with open('../data/s0603-7.txt', encoding='cp932') as f:
    lines = f.readlines()

openでひらいたテキストファイルは、<class '_io.TextIOWrapper'> クラスのオブジェクトとして取り扱うことができるので、readlinesで一行ごとの読み込みが可能。

urllib.request.urlopen での処理例:

with urllib.request.urlopen(
    'https://www.mhlw.go.jp/shingi/2010/06/txt/s0603-7.txt') as f:
    lines = f.read().decode('cp932').split('\n')

urllib.request.urlopen で開いたファイルは http.client.HTTPResponse オブジェクトになるので、read().decode()str オブジェクトにしてから、処理(この場合は改行コードで split してリスト化)する。

分解してそれぞれのタイプを確認すると、下記のようになる。

with urllib.request.urlopen('https://www.mhlw.go.jp/shingi/2010/06/txt/s0603-7.txt') as f:
    obj = f
    str = obj.read().decode('cp932')
    lines = str.split('\n')
print(type(obj))
print(type(str))
print(type(lines))
<class 'http.client.HTTPResponse'>
<class 'str'>
<class 'list'>

参考: io --- ストリームを扱うコアツール - TextIOWrapper — Python 3.9 ドキュメント

参考事例のソース:厚生労働省 薬事・食品衛生審議会(薬事・食品衛生審議会医薬品第一部会)過去議事録から。

次の予定:同様の処理をWeb上のPDFファイルを byte オブジェクトとして扱い、本文のtextを抽出して処理対象とする。

Discussion