2012-04-04 5 views
3

Lorsque j'exécute le script suivant, un fichier de sauvegarde .bak est laissé dans le système de fichiers. Comment fermer() les fichiers correctement pour que les sauvegardes soient effacées?Python - remplace inplace - en supprimant les fichiers de sauvegarde .bak avec close()?

#!C:\Python27\python.exe 
import os 
myRelease = os.environ.get("BUILD_STRING") 
myVersion = os.environ.get("VERSION_STRING") 
import fileinput 
import re 
files = ["C:\Projects\FileToSub.sbs"] 
for line in fileinput.FileInput(files,inplace=1): 
    line = re.sub('whatever, thing', line) 
    print line, 

Répondre

1

Le module fileinput prend soin de supprimer les fichiers de sauvegarde.

Je ne suis pas complètement sûr de ce que vous avez testé, mais votre code python contient des erreurs. Un 'deviné' et version 'corrigée':

import fileinput 
import re 
files = ["FileToSub1.sbs", "FileToSub2.sbs"] 
for line in fileinput.FileInput(files, inplace=1): 
    line = re.sub('whatever', 'thing', line) 
    print line, 

Dans la sortie de strace vous pouvez voir que les fichiers sont supprimés automagiquement:

unlink("FileToSub2.sbs.bak")   = -1 ENOENT (No such file or directory) 
rename("FileToSub2.sbs", "FileToSub2.sbs.bak") = 0 
open("FileToSub2.sbs.bak", O_RDONLY) = 3 
fstat(3, {st_mode=S_IFREG|0644, st_size=30, ...}) = 0 
fstat(3, {st_mode=S_IFREG|0644, st_size=30, ...}) = 0 
open("FileToSub2.sbs", O_WRONLY|O_CREAT|O_TRUNC, 0100644) = 4 
fcntl(4, F_GETFL)      = 0x8001 (flags O_WRONLY|O_LARGEFILE) 
fstat(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdf3a988000 
lseek(4, 0, SEEK_CUR)     = 0 
fstat(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
chmod("FileToSub2.sbs", 0100644)  = 0 
fstat(3, {st_mode=S_IFREG|0644, st_size=30, ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdf3a987000 
read(3, "whatever\nfile\nthing\nline\nwhas\n", 8192) = 30 
read(3, "", 4096)      = 0 
read(3, "", 8192)      = 0 
write(4, "thing\nfile\nthing\nline\nwhas\n", 27) = 27 
close(4)        = 0 
munmap(0x7fdf3a988000, 4096)   = 0 
close(3)        = 0 
munmap(0x7fdf3a987000, 4096)   = 0 
unlink("FileToSub2.sbs.bak")   = 0 
+0

Magiquement en effet :) – Dikei

+0

Mais le fichier de sauvegarde existe toujours pour moi! Peut-être que c'est parce que je cours un script python dans Jenkins? – shanz

+0

Pouvez-vous ajouter la sortie 'strace' à la question? –

2

Vous pouvez appeler la méthode close, par ex.

myfile.close()

Pourquoi ne pas supprimer le fichier en utilisant le os.remove? Vous pouvez le faire:

import os 

# call this after the end of your script 
os.remove("C:\Projects\FileToSub.subs.bak") 
+0

Actuellement ... import stat os.chmod ("C: \ Projects \ FileToSub.sbs.bak", stat.S_IWRITE) os.remove ("C: \ Projets \ FileToSub.sbs.bak") ' Semble faire le travail mais se sent mal. – shanz

+0

peut-être Andreas Florath est plus proche de ce que vous voulez. Voir mon commentaire à sa réponse! –

Questions connexes