ISBN et Bibliothèque
Date: 2026-06-06
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 :
- Emplacement : localisation du livre, dans ce cas, une pièce et une bibliothèque, par exemple “Chambre XYZ côté couloir étage 4”
- Format : livre de poche, livre, livre relié, album
- Collection
- Titre
- Auteurs
- Editeur
- Référence éditeur
- ISBN : Numéros qui permettent d’identifier chaque édition de livre de façon unique
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 :
- Groupe : 2 premiers chiffres
- Éditeur : 4 chiffres
- Titre : 3 chiffres
- Somme de contrôle1 : 1 caractère, qui peut être représenté par le caractère ‘X’ dans le cas où la somme de contrôle vaut 10
Le code ISBN-13 reprend le format des codes EAN-13 :
- Identifiant de pays2 : 3 premiers caractères
- Code ISBN-10 sans somme de contrôle : 9 caractères
- Somme de contrôle3 : 1 caractère, il s’agit de la somme de contrôle utilisée pour les codes-barres de produits
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 :
- isbn.py
- Récupère les code-barres contenus dans des fichiers texte
- Vérifie la validité des codes ISBN : nombre de caractères, préfixe “bookland”8 et checksum
- Écrit un fichier JSON contenant la liste de tous les livres, leur emplacement et la validité de leur code ISBN
- api_request.py
- Lit le fichier JSON écrit par isbn.py
- Interroge la base OpenLibrary pour chaque code ISBN valide
- Écrit un fichier JSON contenant la liste de tous les livres, leur emplacement, et les données au format JSON, telles que téléchargées
- api_parse.py
- Lit le fichier JSON écrit par api_request.py
- Traite les données par titre, auteurs, année, édition et langue
- Enregistre le contenu dans des fichiers JSON, et CSV, utilisable avec un tableur
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
Somme de poids décroissant de 10 à 1, modulo 11 ISBN - Wikipedia↩︎
L’identifiant de pays des codes ISBN est 978 ou 979, qui correspond à “Bookland” Bookland - Wikipedia↩︎
Sommme à poids de 1 pour les digits pairs et 3 pour les digits impairs, modulo 10 International Article Number - Wikipedia↩︎
L’identifiant de pays des codes ISBN est 978 ou 979, qui correspond à “Bookland” Bookland - Wikipedia↩︎
- ← Previous page
Lampe à LEDs : Teardown (2) - Next page →
cms
Electronics Électronique puissance semiconducteur semiconductors power Hardware CPE INSA Xavier Bourgeois
RSS - Blog