ISBN et Bibliothèque

Date: 2026-06-06

Tags: livres python

J’ai voulu lister tous les livres présents dans les bibliothèques d’une maison. Il y a plusieurs attributs de chaque livres qui m’intéressent pour identifier des doublons :

Le fait de répertorier les livres manuellement a deux défauts : le risque de fautes de frappe et d’erreurs de copie est élevé, et c’est une opération très laborieuse et longue. Comme ça reste relativement simple, on peut tenter d’automatiser ça.

Récupération des codes ISBN

Les livres ont des numéros ISBN depuis les années 1970, et des codes-barres depuis les années 1980. Ces numéros sont renseignés dans des bases de données universelles qui permettent de relier un numéro avec les attributs d’un livre.

Dans notre cas, on peut scanner le code-barres, ou recopier manuellement le code ISBN en l’absence de code-barres, et l’utiliser.

Il existe aussi des codes ISSN pour les magazines, mais un seul code ne correspond pas à un unique magazine.

Particularités du code ISBN

Le code ISBN existe avec deux standards : ISBN-13 et ISBN-10, où les nombres indiquent le nombre de caractères du code ou de sa représentation en code-barre.

Le code ISBN-10 est composé d’un code unique à 9 chiffres qui peut se séparer :

Le code ISBN-13 reprend le format des codes EAN-13 :

Protocole

On utilise l’application Binary Eye4, avec les options Scan continuously, et History activées. On va scanner chaque livre successivement, en sauvegardant l’historique dans un fichier différent pour chaque collection, bâtiment, pièce, ou étage de bibliothèque, en fonction de l’organisation voulue.

Dans le cas où un livre n’a pas de code-barres, on le met de côté et on recopiera le numéro ISBN ou les attributs du livre manuellement.

Accès à une base ISBN

Tous les vendeurs de livres proposent l’accès à ces données, mais il faut qu’elles soient accessibles facilement.

Par exemple, le site OpenLibrary, appartenant à Internet Archive donne un accès gratuit à sa base de données ISBN. Le site web a une protection anti-bots/scripts et une politique de fair-use, mais il permet de télécharger des extraits de la base, et donne aussi accès à une API.

Base locale

Une solution proposée par OpenLibrary est de télécharger un extrait de base de données pour l’utiliser localement. On va utiliser l’extrait editions5 qui contient les attributs qui nous intéressent. La base de données complète et compressée occupe 12 GB, et 61 GB décompressée. Le fait qu’elle soit compressée rend les accès très lents, et le volume est beaucoup trop gros pour une utilisation locale.

Base distante et API

L’API6 est limitée à une ou 3 requête par seconde en fonction de l’authentification. Il est possible de tester l’API avec un navigateur web7. En supposant qu’une requête dure 3 secondes, il faudrait 1h pour indexer 1’200 livres, c’est lent mais acceptable.

Programme

On va séparer le programme en 3 fichiers que l’on peut exécuter séparément :

Code

On utilise le langage Python avec la bibliothèque Pandas pour manipuler les données, requests comme client HTTP pour interroger l’API, et json pour trier les données renvoyées par l’API.

Résultats

Les résultats sont approximatifs pour l’instant.

J’ai 1’397 livres scannés, 1’276 codes ISBN valides et 649 livres indexés dans OpenLibrary.

Sur ces 649 livres, beaucoup de cas renvoient le titre original qui peut-être dans une autre langue ou parfois dans un autre alphabet, alors que le livre en question a été traduit.

Exemples de fichiers

barcodes_salon.txt

Ce fichier d’exemple est volontairement tronqué et a des commentaires ajoutés :

9782701145525   # Code ISBN-13 valide
9782311008586   # Code ISBN-13 valide
3549540067755   # Code EAN-13
6788610762078   # Erreur de lecture, le préfixe et le checksum sont invalides
9782040162078   # Code ISBN-13 valide

list1.json

Ce fichier est la sortie du premier programme isbn.py :

{
"ISBN":{"0":"9782701145525","1":"9782311008586","2":"3549540067755","3":"6788610762078","4":"9782040162078","5":""},
"file":{"0":"barcodes_salon.txt","1":"barcodes_salon.txt","2":"barcodes_salon.txt","3":"barcodes_salon.txt","4":"barcodes_salon.txt","5":"barcodes_salon.txt"},
"ISBN_13":{"0":true,"1":true,"2":false,"3":false,"4":true,"5":false},
"ISBN_10":{"0":false,"1":false,"2":false,"3":false,"4":false,"5":false},
"Checksum":{"0":true,"1":true,"2":false,"3":false,"4":true,"5":false}
}

Ici, le checksum n’est calculé que lorsque le nombre de digits et le préfixe correspondent.

list2.json

Le fichier JSON contient plusieurs chaînes JSON qui sont difficiles à lire. Voici un exemple du résultat d’une requête de l’API OpenLibrary pour le dernier livre de la liste :

author_key
    0   "OL619644A"
    1   "OL2865448A"
author_name
    0   "André Lagarde"
    1   "Laurent Michard"
cover_edition_key   "OL21763073M"
cover_i 6937456
ebook_access    "borrowable"
edition_count   1
first_publish_year  1985
has_fulltext    true
ia
    0   "lesgrandsauteurs00laga"
    ia_collection
        0   "americana"
        1   "inlibrary"
        2   "internetarchivebooks"
        3   "printdisabled"
key "/works/OL16028019W"
language
    0   "fre"
lending_edition_s   "OL21763073M"
lending_identifier_s    "lesgrandsauteurs00laga"
public_scan_b   false
title   "MOYEN AGE"

list3.csv

Il ne reste plus qu’à extraire les données récupérées avec le programme api_parse :

ISBN file ISBN_13 ISBN_10 Checksum Title Authors Year Edition Language
0 9782701145525 example.txt True False True La physique par les objets quotidiens “[‘Cédric Ray’, ‘Jean-Claude Poizat’]” 2007 1 [‘fre’]
1 9782311008586 example.txt True False True Histoire de l’oxygène [‘Gérard Borvon’] 2012 1 [‘fre’]
2 3549540067755 example.txt False False False
3 6788610762078 example.txt False False False
4 9782040162078 example.txt True False True MOYEN AGE “[‘André Lagarde’, ‘Laurent Michard’]” 1985 1 [‘fre’]

Références


  1. Somme de poids décroissant de 10 à 1, modulo 11 ISBN - Wikipedia↩︎

  2. L’identifiant de pays des codes ISBN est 978 ou 979, qui correspond à “BooklandBookland - Wikipedia↩︎

  3. Sommme à poids de 1 pour les digits pairs et 3 pour les digits impairs, modulo 10 International Article Number - Wikipedia↩︎

  4. Binary Eye - Github↩︎

  5. Data Dumps - OpenLibrary↩︎

  6. APIs - OpenLibrary↩︎

  7. API - OpenLibrary↩︎

  8. L’identifiant de pays des codes ISBN est 978 ou 979, qui correspond à “BooklandBookland - Wikipedia↩︎

Electronics Électronique puissance semiconducteur semiconductors power Hardware CPE INSA Xavier Bourgeois

Xavier