Réindenter un script Python

Ce script permet de réindenter un script python avec au choix les tabulations ou les espaces.

./reindent.py  <fichier à réindenter> <fichier de sortie> [tab|space] [nombre]

Exemple pour réindenter le fichier toto.py en mettant 3 espaces pour la réindentation :

./reindent.py toto.py new_toto.py space 3
reindent.py
#!/usr/bin/env python
 
import sys, os
 
def usage(error=0):
        print(sys.argv[0] + \
        """ <source file> <new indent file> [type_indent] [count]
        where type_indent is :
                * tab for adding tabs (default)
                * space for adding spaces
 
        where count is the number of type_indent :
                * int (1 by default)
 
        Ex : """ + sys.argv[0]+ """ file.py new_indent_file.py space 4  """)
        sys.exit(error)
 
if not os.path.isfile(sys.argv[1]): 
        print(sys.argv[1] + " n'est pas un fichier valide !")
        usage(1)
 
try:
        if sys.argv[3] == "tab": sep = "\t"
        elif sys.argv[3] == "space": sep = " "
        else:
                print("Seuls les arguments space et tab sont autorisés !")
                usage(1)
except IndexError:
        sep = "\t"
 
try:
        sep_count = int(sys.argv[4])
except IndexError:
        sep_count = 1
except ValueError:
        print(sys.argv[4] + " doit être un nombre !")
        usage(1)
 
sep = sep * sep_count
num_line, score, indent = 0, list(), dict()
fr, fw = open(sys.argv[1], 'r'), open(sys.argv[2], 'w')
 
for line in fr:
        nb_tab, nb_space = 0, 0
        num_line += 1
 
        for i in range(len(line)):
                if line[i] == ' ': nb_space += 1
                elif line[i] == '\t': nb_tab += 1
                else:
                        score.append(nb_tab * 1 + nb_space)
                        if num_line == 1:
                                indent[score[num_line - 1]] = 0
                                fw.write(line[i:])
                        else:
                                if score[num_line - 1] not in indent and score[num_line - 1] > score[num_line - 2]:
                                        indent[score[num_line - 1]] = indent[score[num_line - 2]] + 1
                                        fw.write(sep * indent[score[num_line - 1]] + line[i:])
                                elif score[num_line - 1] not in indent and score[num_line - 1] <= score[num_line - 2]:
                                        print("Problème d'indentation dans le programme source, vérifier l'indentation ligne " + num_line + "!\nArrêt du programme...")
                                        sys.exit(1)
                                else:
                                        fw.write(sep * indent[score[num_line - 1]] + line[i:])
                        break
 
        print(num_line," Score : ", score[num_line - 1],"\tTab : ",nb_tab,"\tSpace : ",nb_space)
 
fr.close()
fw.close()