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.
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.