Wikidata:Pywikibot - Python 3 Tutorial/Structured Data on Commons

Sample code to work with Structured Data on Commons

import pywikibot

commons_site = pywikibot.Site("commons", "commons")

# File to test and work with
commonsfilename='File:Madame X (Madame Pierre Gautreau) MET DT278076.jpg'

page = pywikibot.FilePage(commons_site, commonsfilename)

# Retrieve Wikibase data
item = page.data_item()
item.get()

print ('Commons MID:', item.id) # M56723871

for prop in item.claims:
    for statement in item.claims[prop]:
        if isinstance(statement.target, pywikibot.page._wikibase.ItemPage):
            print (prop, statement.target.id, statement.target.labels.get('en'))
        else:
            print (prop, statement.target)

Sample output:

Commons MID: M56723871
P180 Q2664039 Portrait of Madame X
P180 Q116887 décolletage
P180 Q467 woman
P6243 Q2664039 Portrait of Madame X
P921 Q2664039 Portrait of Madame X
P1163 image/jpeg
P31 Q3305213 painting
P136 Q1400853 portrait painting

Adding qualifiers edit

import pywikibot

# Add qualifier to existing claim
# https://www.wikidata.org/wiki/Wikidata:Pywikibot_-_Python_3_Tutorial/Setting_qualifiers
def add_qualifier(claim, qualifier_prop, qualifier_value):
    wikidata_site = pywikibot.Site("wikidata", "wikidata")
    print(f'Adding qualifier: {qualifier_prop} {qualifier_value} to claim value {claim.getTarget()}')
    
    # Create qualifier
    qualifier = pywikibot.Claim(wikidata_site, qualifier_prop)
    qualifier_target = pywikibot.ItemPage(wikidata_site, qualifier_value)
    qualifier.setTarget(qualifier_target)
    
    # Add qualifier to claim. This already saves the edit.
    claim.addQualifier(qualifier)


# Return False if qualifier with qualifier_value doesn't exits
def test_if_qualifier_exists(claim, qualifier_prop, qualifier_value):
    if not claim.qualifiers:
        return False
    
    elif not qualifier_prop in claim.qualifiers:
        return False
    
    else:
        for qualifier in claim.qualifiers[qualifier_prop]:
            qualifier_value = qualifier.getTarget()
            if qualifier_value == qualifier.getTarget():
                return True

### MAIN()

# Connect to Wikidata
site = pywikibot.Site("commons", "commons")
repo = site.data_repository()

# Load the commons item
page = pywikibot.FilePage(site, 'File:Akateemisen Karjala-Seuran 15-vuotisjuhlat Vanhalla ylioppilastalolla 21.2.1937.jpg')  # Specify the file
item = page.data_item()  # Get the data item associated with the page

# Identify the claim (assuming you know the property ID)
property_id = "P9310"  # Replace with the actual property ID of the claim
claims = item.claims[property_id]

qualifier_prop = "P459"
qualifier_value = "Q104884110"

# Loop through claims
for claim in claims:
    print(f"Property: {property_id}, Value: {claim.getTarget()}")
    
    qualifier_exists = test_if_qualifier_exists(claim, qualifier_prop, qualifier_value)
        
    if qualifier_exists:
        print(f'Qualifier: {qualifier_prop} : {qualifier_value} already exists.')
    else:
        add_qualifier(claim, qualifier_prop, qualifier_value)