🐍

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

ログインするとコメントできます