Bestätigen Sie das Überschreiben der Datei mit der Option, das Dateiobjekt als Argument mit Python argparse zu verwenden

Motivation

Im Befehlszeilenparser argparse, der in der Standardbibliothek von python enthalten ist, kann ein Dateiobjekt als Argumenttyp angegeben werden. es kann. (argparse.FileType) Dies ist sehr praktisch, da Sie kein Dateiobjekt aus einer Zeichenfolge erstellen müssen.

Selbst wenn Sie den Schreibmodus angeben (mode = 'w'), wird er automatisch geöffnet, ohne zu sagen, ob er vorhanden ist oder nicht. Bei einer schlampigen Person wird die Datei unbeabsichtigt überschrieben und der Inhalt gelöscht. Es besteht ein Risiko und es ist sehr gefährlich. Daher habe ich die Bestätigung zum Überschreiben von Dateien implementiert. Notieren Sie sich dies, damit Sie nicht vergessen, wie es geht.

Implementierungsbeispiel.

Ein Beispiel, das in meiner Arbeit pdf_merge_multipages unter Bezugnahme auf die am Ende des Satzes aufgeführte Site-Methode implementiert wurde.

pdf_merge_multipages.py(Auszug)



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()

Wenn die Datei vorhanden ist und Sie ein Überschreiben vermeiden, müssen Sie möglicherweise zwischen dem Beenden des Skripts (exit ()) oder dem Auslösen einer Ausnahme wählen. Im obigen Beispiel wird "exit ()" verwendet. Wenn die Datei jedoch zuerst im Lesemodus mit dem Argument "Eingaben" geöffnet wurde, wird das Skript möglicherweise beendet, ohne es zu schließen. Der Punkt, an dem das Geschlecht bleibt, ist ein wenig gefangen.

Referenzmaterial

Recommended Posts

Bestätigen Sie das Überschreiben der Datei mit der Option, das Dateiobjekt als Argument mit Python argparse zu verwenden
Erstellen Sie mit PyInstaller eine exe-Datei, die in einer Windows-Umgebung ohne Python funktioniert
Format, wenn eine lange Zeichenfolge als Python-Argument übergeben wird
Rufen Sie die Formel in der Excel-Datei als Zeichenfolge in Python ab
Ein Skript, das Tweets mit Python abruft, sie in einer externen Datei speichert und morphologische Analysen durchführt.
Extrahieren Sie mit Python Zeilen, die den Bedingungen entsprechen, aus einer Textdatei
Die eval () -Funktion, die eine Zeichenfolge als Ausdruck in Python berechnet
Erstellen einer einfachen Power-Datei mit Python
[Python] Ein Programm, das Treppen mit # erstellt
Erstellen Sie schnell eine Excel-Datei mit Python #python
Eine typisierte Welt, die mit Python beginnt
Ich habe mit Python eine Einstellungsdatei erstellt
Erstellen Sie eine Anwendung, die Formulare mithilfe von Python / Flask anstelle von DB eingibt, anzeigt und löscht.
Lesen einer CSV-Datei mit Python 2/3
Erstellen Sie eine App, die Schüler mit Python errät
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
Erstellen Sie mit Python eine Datei im Photoshop-Format (.psd)
Lambda-Ausdruck (Korrektur), der einen Index (Wörterbuch mit Mitgliedsschlüssel) der Mitglieder des Objekts erstellt, das in Python gesammelt wird
Lesen Sie mit Python Zeile für Zeile aus der Datei
Ich möchte mit Python in eine Datei schreiben
Dateidialog mit Python-GUI öffnen (tkinter.filedialog)
Fügen Sie ein Objekt in eine Zeichenfolge in Python ein
Ein Python-Skript, das eine datierte CSV-Datei als Zeitpartitionstabelle in BigQuery importiert
[Python] Sie können ein Objekt mithilfe des Pickle-Moduls in einer Datei speichern.
Beachten Sie, dass VSCode + Python einen interaktiven Anzeigemodus wie Jupyter Notebook verwendet
Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!
[Python] Wenn Sie eine Datei mit demselben Namen wie das zu importierende Modul erstellen, tritt ein Attributfehler auf.
Ein Skript, das eine Momentaufnahme eines EBS-Volumes erstellt
Ein Tool, das aus einem eigenständigen JAR eine ausführbare Datei macht
Ein Server, der POST-Daten mit flask / python wiedergibt
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Python: Ruft eine Liste der Methoden für ein Objekt ab
Führen Sie eine Python-Datei mit relativem Import in PyCharm aus
[Python] Erstellen Sie mit cx_Freeze eine Verteilungsdatei für das Tkinter-Programm
Erstellen Sie eine 2D-CAD-Datei ".dxf" mit Python [ezdxf]