-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcsv_decompte_des_colonnes.py
79 lines (73 loc) · 3.22 KB
/
csv_decompte_des_colonnes.py
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
77
78
79
#!/usr/bin/python3
"""
Ce programme compte le nombre de colonnes de tout un fichier csv
* donne le nombre de colonne
* avertit si une ligne a un nmobre différent de colonnes
Création du programme le 5 novembre 2019
Dernière modification le 11 janvier 2023
"""
import csv
import argparse #gestion des arguments
parser = argparse.ArgumentParser(description="Compte le nombre de colonnes d'un fichier csv, il affiche le nombre de colonnes et avertit si certaines lignes n'ont pas le même nombre de colonnes.")
parser.add_argument('fichier', help='le fichier dont on doit dénombrer les colonnes')
parser.add_argument('-sep', nargs='?', help="le séparateur du fichier csv, par défaut il s'agit du ;")
parser.add_argument('-idq', action='store_true', help="ignore les guillemets dans le fichier, permet de résoudre certaines erreurs liées à la présence d'un seul guillemet dans les champs")
parser.add_argument('-bf', action='store_true', help="indique que le fichier est un gros fichier (+ de 100 000 lignes)")
parser.add_argument('-n', action='store_true', help="renvoie uniquement le nombre de colonnes, renvoie ERROR si ce nombre n'est pas constant")
args = parser.parse_args()
fichier = args.fichier
if args.sep:
delimiter = args.sep
else:
delimiter = ';'
if args.n:
number_only = True
else:
number_only = False
if args.idq:
ignore_doublequote = True
else:
ignore_doublequote = False
if args.bf: # J'augmente la limite à 2 000 000 de lignes
csv.field_size_limit(2000000)
premiere_ligne = True
probleme_de_nombre_de_colonnes = False
ligne_en_cours = 1
try:
with open(fichier, newline='') as f:
if ignore_doublequote:
reader = csv.reader(f, delimiter=delimiter, quoting=csv.QUOTE_NONE)
else:
reader = csv.reader(f, delimiter=delimiter)
try:
for row in reader:
if premiere_ligne:
nbre_colonne = len(row)
premiere_ligne = False
if not number_only:
print("Nombre de colonne du début du fichier = ", nbre_colonne)
if len(row) != nbre_colonne:
probleme_de_nombre_de_colonnes = True
nbre_colonne = len(row)
if not number_only:
print(" -- un nombre de colonne différent ({}) a été détecté à la ligne {}".format(nbre_colonne, ligne_en_cours))
ligne_en_cours += 1
except UnicodeDecodeError:
print(f"\nErreur: Le fichier {fichier} n'est pas encodé en utf8")
exit()
except Exception as error :
print(f"\nErreur: L'erreur suivante s'est produite : ({error}), sur la ligne {ligne_en_cours}")
exit()
except FileNotFoundError:
print(f"\nErreur: Le fichier {fichier} n'a pas été trouvé\n")
exit()
if number_only:
if probleme_de_nombre_de_colonnes:
print('ERROR')
else:
print(nbre_colonne)
else:
if probleme_de_nombre_de_colonnes:
print(f"\nLe fichier {fichier} n'a pas un nombre constant de colonnes sur ses {ligne_en_cours - 1} lignes")
else:
print(f"\nLe fichier {fichier} a un nombre constant de colonnes sur ses {ligne_en_cours - 1} lignes :)")