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