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