Usuario:Chewie/cuenta ediciones.py

De Wikipedia, la enciclopedia libre

Este script recibe un dump de la tabla de metadatos de revisiones comprimido en gzip y crea una lista ordenada de tuplas que relacionan a un usuario con el número de ediciones que ha realizado.

# -*- coding: utf-8 -*-
import gzip
import re
import sys

# Lo que debe recibir este script es un dump en XML de la tabla stub-meta-history,
# comprimido con gzip.
url = sys.argv[1]
f = gzip.open(url, 'r')

user_pattern = re.compile('<username>(.*)</username>')

# Este diccionario acabará teniendo un usuario (o IP) como índice y un entero
# con el número de ediciones como valor.
editions_dic = {}

sys.stderr.write("Examinando fichero y contando ediciones")
for line in f:
    user = re.findall(user_pattern, line)
    if user:
        userstring = user[0]
        if editions_dic.has_key(userstring):
            editions_dic[userstring] = editions_dic[userstring] + 1
        else:
            editions_dic[userstring] = 1
            sys.stderr.write(".")
f.close()

# Como un diccionario no tiene orden, lo transformamos en una lista y
# lo ordenamos. editions_list será una lista de tuplas ('Usuario', n_ediciones)
# ordenada por el número de ediciones.
print >> sys.stderr, "Ordenando lista...\n"
editions_list = [(v, k) for k, v in editions_dic.items()]
editions_list.sort()
editions_list.reverse()
editions_list = [(k, v) for v, k in editions_list]

# Aquí habría que hacer algo útil con editions_list. Por ejemplo, serializarla
# en un fichero.
import pickle
tstamp = re.findall('eswiki-([0-9]*)-stub', url)[0]
print >> sys.stderr, "Escribiendo objeto en fichero...\n"
d = open('wikipedistas_por_ediciones_%s.pickle' % tstamp, 'w')
pickle.dump(editions_list, d)
d.close()