txtファイルからjson形式の省市街地データを抽出する方法を教えます

3877 ワード

偉大な国家統計局は省市街地の情報を提供してくれた[1].残念ながらjson形式ではなく、本当に使うことはできなかった.我々が必要とするフォーマットデータを得るために,筆者はtxtフォーマットの省市街地をjsonフォーマットに変換するpythonスクリプトを開発した.(エンディングにサプライズがありましたよ_)
オペレーティングシステム:ubuntu mate[2]、pythonバージョン:python 3.4,エディタ:pluma.
国家統計局のウェブサイト上の省市区情報は、コードに階層構造がなく、BeautifulSoup[3]で解析するのも時間の無駄であり、筆者はそれを直接cityにコピーして貼り付けた.txtで.
次に、スクリプトの開発を開始します.
モデルの定義
省市街地自体が3つの既成の対象であり、考えにくい.
# province of china
class Province:
    def __init__(self, code, name):
        self.code = code
        self.name = name

# city of province
class City:
    def __init__(self, code, name):
        self.code = code
        self.name = name

# coutry of city
class Country:
    def __init__(self, code, name):
        self.code = code
        self.name = name

省市にはそれぞれの部下行政区があるので、sub属性を加えて部下を網羅します.
class Province:
    def __init__(self, code, name):
        # ...
        self.sub = []

class City:
    def __init__(self, code, name):
        # ...
        self.sub = []

これで、私たちの省市街地モデルは初歩的な定義が完成したとしても.
作成方法
モデルがあればまだ足りないが,適切な方法を加えてこそ,オブジェクト向けの優位性を示すことができる.オブジェクトの名前を指定すれば、開発とデバッグを容易にするために必要なオブジェクト情報を返す方法__repr__()が必要です.
class Province:
    # ...
    def __repr__(self):
        return '''{"code":%r ,"name": %r, "sub":%r}
''' % (self.code, self.name, self.sub) class City: # ... def __repr__(self): return '''{"code":%r ,"name": %r, "sub":%r}
''' % (self.code, self.name, self.sub) class Country: # ... def __repr__(self): return '''{"code":%r, "name": %r}
''' % (self.code, self.name)

すべての省級行政区の構築が完了すると、このオブジェクトを出力する文字列形式が最終的なjsonデータとなる.jsonのフォーマットを保証するために,我々の__repr__()メソッドはカスタマイズされ,出力された結果はクラス名も<>で囲まれていない.
完全な省市級行政区を構築するためには、部下の市と区をsub配列に追加する帰属方法が必要です.配列のappend()法を用いて実現することができる.
class Province:
    # ...
    def consist(self, city):
        self.sub.append(city)

class City:
    # ...
    def consist(self, country):
        self.sub.append(country)

また、行政区の等級を判断する関数も必要です.簡単に見てみろtxt、この法則を見つけるのは難しくありません.
すべての省級行政区のコードの終わりは0000で、すべての地級市のコードの終わりは00で、その他は区県級の行政区画です.
例えば栗:江蘇のコードは:320000で、南京のコードは:320100で、秦淮区のコードは:320104です.
そこで、筆者は最後の0に基づいてレベルを判定する方法を書いた.
# judge the type by code
def zero(n):
    i = 1
    if n <= 0:
        return 0
    while n % i == 0:
        i *= 10
    return i/10

テキストの解析
次に、cityを行単位で読み出す.txtのデータは、簡単で乱暴で効果が速い.
def get_data(filename):
    arr = []
    # open the city.txt
    with open(filename, "r", encoding="utf-8") as read:
        print("file has been open.")
        for line in read:
            arr.append(line.strip())
    print("reading finished")
    return arr

ここで唯一注目すべきはcityです.txtの符号化とは何か、ファイルを開いて指定した符号化とは何か.ここでの符号化はutf-8です.
出力json
やはりcityを観察します.txtは、省級行政区がトップであるほか、数の異なるスペースがある.get_data()法により得られたのは、実際には配列であり、要素はこのような110100 に類似している.スペースの存在も見えます.スペースのutf−8符号化は\u3000であり、strip("\u3000")を用いて先頭のスペースを除去する.その後、数字をcodeに保存し、有効な文字をnameに保存します.次いで、zero()メソッドによって返された結果に従って、対応するオブジェクトが構築される.最後に省クラスのオブジェクトを出力すると省市街地jsonデータが得られる.
最後に、この小さなサプライズを発表します:ソースコードと捕まえたjsonデータは私のgithubで取得することができます.リンク:https://github.com/zhancongc/city_parse
ふろく
  • 統計局のウェブサイト:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201703/t20170310_1471429.html
  • 本プログラムはubuntu mateで正常に動作し、出力は正常である.Windows 10で実行すると、出力される中国語が文字化けしてしまいますが、原因は不明です.
  • Beautiful Soupは、HTMLファイルまたはXMLファイルからデータを抽出できるPythonライブラリです.通常のドキュメントのナビゲーション、検索、変更は、お気に入りのコンバータで実現できます.