Draft Workflow/script

From EAGLE MediaWiki
Jump to: navigation, search

Cosa fa

Questo è uno script che utilizzo su Wikidata per inserire su item già esistenti delle dichiarazioni (ossia: "P:1" = "valore"). L'autore è ValterVB.

Ogni volta, mi creo un file di testo e su ogni riga imposto una riga di codice come segue:

<id elemento> | <id proprietà> | <valore proprietà> | <id proprietà fonte> | <valore fonte> | <valore unico (0) o no (1)> | <tipo (s = stringa, i = item)>

Esempio:

  • Q16181|p150|Q116370|p143|q11920|1|'i'
  • Q95052|p806|A057|p143|q11920|0|'s'

Lo script in Python legge in maniera continua la presenza di questi file nella directory indicata nello script, quando ne trova uno lo legge. Per ogni riga verifica se esiste già la proprietà ed agisce a seconda del parametro Unico (0 o 1). Quando ha letto tutto il file lo copia in una directory di archivio definita all'interno dello script, e lo cancella dalla directory di lavoro.

Note

Le directory indicate più sotto, ossia:

  • path = r"C:\pywikipediacore\lavoro\fare" #Directory da cui leggere i file
  • pathCopy = 'C:\pywikipediacore\lavoro\fatto' #Directory su cui archiviare i file

si possono cambiare.

Script

# -*- coding: utf-8 -*-
import pywikibot
import os
import time
import shutil
import sys

#Restituisce vero se la proprietà con quel valore esiste
def ExistPropertyValue(value,claim):
    for p in claim:
        tmp = str(p.getTarget()).replace("[[","").replace("]]","")
        if 'wikidata' in tmp: # Il valore è un item
            dati=tmp.split(':')
            dato=dati[1]
            if dato == value.title():
                return True
        else: # Il valore è una stringa (da verificare su funziona con il tipo Commons)
            dato=tmp
            if dato == value:
                return True

    return False


loop = True
path = r"C:\pywikipediacore\lavoro\fare" #Directory da cui leggere i file
pathCopy = 'C:\pywikipediacore\lavoro\fatto' #Directory su cui archiviare i file
wd = pywikibot.Site('wikidata','wikidata').data_repository()

while loop: #Ciclo infinito di lettura della directory
    try:
        listing = os.listdir(path)
        count = len([f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))])
        if count == 0:
            print "Nessun file, pausa 2 secondi"
            time.sleep(2)
        else:
            for infile in listing: #Loop sui file nella directory
                f = open(path + "\\" + infile)
                f.readline()
                for line in iter(f):
                    line = line.rstrip('\r\n')
                    data=line.split('|')
                    id = data[0]
                    print id
                    proprieta = data[1]
                    valore = data[2]
                    prop_fonte = data[3]
                    val_fonte = data[4]
                    singolo = data[5] # se 0 valore singolo, se 1 valore multiplo
                    tipo = data[6]
                    data = pywikibot.ItemPage(wd,id) #Carico l'item da Wikidata
                    data.get() #Carico i dati
                    if proprieta in data.claims: #controlla se esiste già la proprietà
                        if singolo == '0':
                            pass #Da fare: verificare se è uguale
                        else:
                            if ExistPropertyValue(valore,data.claims[proprieta]): #Controlla se la proprietà con quel valore esiste già
                                pass
                            else: # proprietà multipla
                                if tipo == "'s'": #Stringa
                                    claim = pywikibot.Claim(wd,proprieta) # Proprietà
                                    claim.setTarget(valore) # Valore proprietà
                                    data.addClaim(claim) # add claim
                                else: #Item
                                    claim = pywikibot.Claim(wd,proprieta) # Proprietà
                                    claim.setTarget(pywikibot.ItemPage(wd,valore)) # Valore proprietà
                                    data.addClaim(claim) # add claim
                                if val_fonte:
                                    reference=pywikibot.Claim(wd,prop_fonte) # Fonte
                                    reference.setTarget(pywikibot.ItemPage(wd,val_fonte)) # Valore fonte
                                    claim.addSource(reference) # add source
                    else:
                        if tipo == "'s'":
                            claim = pywikibot.Claim(wd,proprieta) # Proprietà
                            claim.setTarget(valore) # Valore proprietà
                            data.addClaim(claim) # add claim
                        else:
                            claim = pywikibot.Claim(wd,proprieta) # Proprietà
                            claim.setTarget(pywikibot.ItemPage(wd,valore)) # Valore proprietà
                            data.addClaim(claim) # add claim
                        if val_fonte:
                            reference=pywikibot.Claim(wd,prop_fonte) # Fonte
                            reference.setTarget(pywikibot.ItemPage(wd,val_fonte)) # Valore fonte
                            claim.addSource(reference) # add source
                f.close
                print "Fine del file. Item: " + id
                f = None
                shutil.copy2(path + "\\" + infile, pathCopy + "\\" + infile)
                os.remove(path + "\\" + infile)
    except Exception:
        print "Errore: su " + id, proprieta, valore
        print "Unexpected error:", sys.exc_info()[0]
        time.sleep(5) #Pausa 5 secondi
        pass