Confirmer l'écrasement du fichier avec l'option de prendre l'objet fichier comme argument avec Python argparse

Motivation

Dans l'analyseur de ligne de commande argparse inclus dans la bibliothèque standard de python, il est possible de spécifier un objet fichier comme type d'argument. ça peut. (ʻArgparse.FileType`) C'est très pratique car vous n'avez pas à vous soucier de créer un objet fichier à partir d'une chaîne de caractères.

Cependant, même si vous spécifiez le mode d'écriture (mode = 'w'), il s'ouvrira automatiquement sans dire s'il est présent ou non, donc pour une personne bâclée, il écrasera involontairement le fichier et effacera le contenu. Il y a un risque et c'est très dangereux. Par conséquent, j'ai implémenté la confirmation d'écrasement de fichier, alors prenez note afin de ne pas oublier comment le faire.

Exemple de mise en œuvre.

Un exemple implémenté dans mon travail pdf_merge_multipages en référence à la méthode du site listée en fin de phrase.

pdf_merge_multipages.py(Extrait)



class FileTypeWithCheck(argparse.FileType):

    def __call__(self, string):
        if string and "w" in self._mode:
            if os.path.exists(string):
                sys.stderr.write(('File: "%s" exists. Is it OK to overwrite? [y/n] : ') % (string))
                ans = sys.stdin.readline().rstrip()
                ypttrn = re.compile(r'^y(es)?$', re.I)
                m = ypttrn.match(ans)
                if not m:
                    sys.stderr.write("Stop file overwriting.\n")
                    sys.exit(1)
                    # raise ValueError('Stop file overwriting')
            if os.path.dirname(string):
                os.makedirs(os.path.dirname(string),
                            exist_ok=True)
        return super(FileTypeWithCheck, self).__call__(string)

    def __repr__(self):
        return super(FileTypeWithCheck, self).__repr__()

....

....

def main():
    argpsr = argparse.ArgumentParser(description='Merge multiple mages in PDF files w/o gap.')
    argpsr.add_argument('inputs', metavar='input-file', type=argparse.FileType('rb'),
                        nargs='+', help='Input PDF file(s)')
    argpsr.add_argument('-output', metavar='filename', type=FileTypeWithCheck('wb'),
                        nargs=1, help='Output file', dest='output', default='a.out.pdf')

...
...

def main():
    argpsr = argparse.ArgumentParser(description='Merge multiple mages in PDF files w/o gap.')
    argpsr.add_argument('inputs', metavar='input-file', type=argparse.FileType('rb'),
                        nargs='+', help='Input PDF file(s)')
    argpsr.add_argument('-output', metavar='filename', type=FileTypeWithCheck('wb'),
                        nargs=1, help='Output file', dest='output', default='a.out.pdf')

...
...

if __name__ == '__main__':
    main()

Si le fichier existe et que vous évitez d'écraser, vous devrez peut-être choisir entre quitter le script (ʻexit () ) ou lever une exception. Dans l'exemple ci-dessus, ʻexit () est utilisé, mais si le fichier a été ouvert en mode lecture avec l'argument ʻinputs` plus tôt, le script peut se terminer sans le fermer. Le point où le sexe reste est un peu pris.

Matériel de référence

Recommended Posts

Confirmer l'écrasement du fichier avec l'option de prendre l'objet fichier comme argument avec Python argparse
Créez un fichier exe qui fonctionne dans un environnement Windows sans Python avec PyInstaller
Format lors du passage d'une longue chaîne comme argument de python
Obtenez la formule dans le fichier Excel sous forme de chaîne en Python
Un script qui récupère les tweets avec Python, les enregistre dans un fichier externe et effectue une analyse morphologique.
Extraire les lignes qui correspondent aux conditions d'un fichier texte avec python
Fonction Eval () qui calcule une chaîne de caractères comme expression en python
Créer un fichier power simple avec Python
[Python] Un programme qui crée des escaliers avec #
Créez rapidement un fichier Excel avec Python #python
Un monde typé qui commence par Python
J'ai créé un fichier de configuration avec Python
Créez une application qui saisit, affiche et supprime des formulaires à l'aide de Python / Flask au lieu de DB.
Comment lire un fichier CSV avec Python 2/3
Créez une application qui devine les étudiants avec Python
Créer une page qui se charge indéfiniment avec python
Créer un fichier au format Photoshop (.psd) avec python
Expression Lambda (correction) qui crée un index (dictionnaire à clé de membre) des membres de l'objet collecté en python
Lire ligne par ligne à partir d'un fichier avec Python
Je veux écrire dans un fichier avec Python
Ouvrir la boîte de dialogue de fichier avec l'interface graphique Python (tkinter.filedialog)
Insérer un objet dans une chaîne en Python
Un script python qui importe un fichier csv daté dans BigQuery en tant que table de partition de temps
[Python] Vous pouvez enregistrer un objet dans un fichier en utilisant le module pickle.
Remarque à l'aide de VSCode + Python avec le mode d'affichage inductif de type notebook Jupyter
Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!
[Python] Si vous créez un fichier avec le même nom que le module à importer, une erreur d'attribut se produira.
Un script qui prend un instantané d'un volume EBS
Un outil qui transforme un jar autonome en un fichier exécutable
Un serveur qui fait écho aux données POSTées avec flask / python
Un mémo que j'ai touché au magasin de données avec python
Python: obtenir une liste de méthodes pour un objet
Exécuter un fichier Python avec une importation relative dans PyCharm
[Python] Créez un fichier de distribution pour le programme Tkinter avec cx_Freeze
Créer un fichier CAO 2D ".dxf" avec python [ezdxf]