OpenData

L’OpenData c’est vraiment bien parce qu’on peut faire des choses fun. Et ce soir j’ai appris qu’il est possible d’obtenir des données de la Poste. Génial! Mais après avoir vu l’aspect du fichier mis à disposition, j’ai presque pleuré. Alors j’ai décidé de faire un petit script qui me sera utile.

#! /usr/bin/env python
#-*- coding: utf-8 -*-

import sys
import csv
import urllib2
from contextlib import contextmanager

POSTAL_CODES = "https://www.data.gouv.fr/s/resources/base-officielle-des-codes-postaux/20141106-120608/code_postaux_v201410.csv"

@contextmanager
def open_url(url):
    try:
        f = urllib2.urlopen(url)
    except IOError as err:
        yield None, err
    else:
        try:
            yield f, None
        finally:
            f.close()

def usage():
    print "This script takes one argument."
    print "Usage:"
    print "\tpcodes.py city"
    exit(1)

if __name__ == "__main__":
    # Point of entry in execution mode.
    if len(sys.argv) != 2:
        usage()

    city = sys.argv[1]

    with open_url(POSTAL_CODES) as (postal_codes, err):
        if err:
            print err
        else:
            dialect = csv.Sniffer().sniff(postal_codes.read(1024))
            rows = csv.reader(postal_codes, dialect)
            result = sorted([(row[1], row[2]) for row in rows
                                    if city.lower() in row[1].lower()],
                            key=lambda x: x[0])
            print "\n".join([value + " " + key for key, value in result])

Utilisation:

$ ./pcodes.py grosblie
57520 GROSBLIEDERSTROFF

J’avais trouvé d’autres scripts pour faire ça. Mais souvent au bout d’un certain temps, ils ne fonctionnent plus (disparation de la ressource Web, généralement). Espérons que celui-ci fonctionnera longtemps.

Related Posts