Difference between revisions of "Draft Workflow/script"
Jump to navigation
Jump to search
(Created page with "== Note == Le directory indicate più sotto, ossia: * path = r"C:\pywikipediacore\lavoro\fare" #Directory da cui leggere i file * pathCopy = 'C:\pywikipediacore\lavoro\fatto'...") |
|||
Line 1: | Line 1: | ||
+ | == 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: |
||
+ | <pre> |
||
+ | <id elemento> | <id proprietà> | <valore proprietà> | <id proprietà fonte> | <valore fonte> | <valore unico (0) o no (1)> | <tipo (s = stringa, i = item)> |
||
+ | </pre> |
||
+ | |||
+ | 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 == |
== Note == |
||
Le directory indicate più sotto, ossia: |
Le directory indicate più sotto, ossia: |
Latest revision as of 17:49, 9 September 2013
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