1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Détecte le type de fichier et son MIME
Détecte l'encodage du fichier ISO2709 (unimarc).
puis
Afficher le titre si présent en zone 200$a.
avec encodage utf-8 -> cela fonctionne bien
avec encodage iso8859-x -> KO
test avec chardet (4.0.0)
test avec pymarc (5.0.0)
argument 1 -> fichier unimarc
"""
import sys
import chardet
import encodings
import magic
from pymarc import MARCReader
def analyse(fichier):
print("type de fichier : " + magic.from_file(fichier))
print("type MIME du fichier : " + magic.from_file(fichier, mime = True))
# le compteur de notice
numnotice = 0
rawdata = open(fichier, 'rb').read()
result = chardet.detect(rawdata)
charenc = result['encoding']
print ("l'encodage probable est " + charenc)
with open(fichier, 'rb') as fh:
if charenc == "utf-8":
reader = MARCReader(fh, to_unicode=True, force_utf8=True)
else:
print("le fichier est analysé avec un encodage en " + charenc)
# reader = MARCReader(fh) # PB Unable to parse character 0xa0 in g0=66 g1=69 (7 lignes même message)
reader = MARCReader(fh, file_encoding='iso8859_9') # affiche le titre mal decodé (par chardet)
# reader = MARCReader(fh, file_encoding='iso8859_15') # affiche le titre mal decodé
# reader = MARCReader(fh, file_encoding='cp850') # affiche le titre mal decodé (dos Europe)
# reader = MARCReader(fh, file_encoding='cp1252') # affiche le titre mal decodé (Windows Europe)
for record in reader:
numnotice += 1
print("----------------------------")
print("notice numéro : " + str(numnotice))
for field in record.get_fields('200'):
if field['a'] is not None:
if charenc != "utf-8":
field = field['a']
lenfield=len(field)
print("le nombre de caractère du titre est : " + str(lenfield))
print("Le titre non decodé est : \033[41m" + field + "\033[0m")
try:
field2 = field.decode('iso8859_9', errors='strict').encode('utf8', errors='strict')
# field2 = field.decode('iso8859_15').encode('utf8', errors='strict')
# field2 = field.decode('cp850').encode('utf8', errors='strict')
# field2 = field.decode('cp1252').encode('utf8', errors='strict')
print("le titres decodé est " + str(field2))
except AttributeError:
pass
# si le titre est en utf8
else:
print("le titres est \033[1;32m" + field['a'].upper())
print("\033[0m")
elif field['a'] is None:
print('pas de titre en 200$a')
if __name__ == "__main__":
fichier = (sys.argv[1])
print("le fichier à analyser est : " + fichier)
analyse(fichier) |
Partager