Maintenant j'utilise:
pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
Mais pour améliorer l'apparence du code, je peux faire:
output = open('pagehead.section.htm','r').read()
Comment utiliser la syntaxe ci-dessus pour fermer le fichier afin de libérer des ressources système?
Vous n'avez pas vraiment besoin de le fermer - Python le fera automatiquement soit lors du ramassage des ordures soit à la sortie du programme. Mais, comme @delnan l'a noté, il est préférable de le fermer explicitement pour diverses raisons.
Donc, ce que vous pouvez faire pour rester bref, simple et explicite:
with open('pagehead.section.htm','r') as f:
output = f.read()
Maintenant, ce ne sont que deux lignes et très lisibles, je pense.
Le module Python Standard Library Pathlib fait ce que vous cherchez:
Path('pagehead.section.htm').read_text()
N'oubliez pas d'importer Path:
jsk@dev1:~$ python3
Python 3.5.2 (default, Sep 10 2016, 08:21:44)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pathlib import Path
>>> (Path("/etc") / "hostname").read_text()
'dev1.example\n'
À l'aide de CPython, votre fichier sera fermé immédiatement après l'exécution de la ligne, car l'objet fichier est immédiatement nettoyé. Il y a cependant deux inconvénients:
Dans des implémentations Python différentes de CPython, le fichier n'est souvent pas immédiatement fermé, mais plutôt ultérieurement, hors de votre contrôle.
En Python 3.2 ou supérieur, cela lancera une ResourceWarning
, si activé.
Mieux vaut investir une ligne supplémentaire:
with open('pagehead.section.htm','r') as f:
output = f.read()
Cela garantira que le fichier est correctement fermé en toutes circonstances.
Ce que vous pouvez faire est d'utiliser l'instruction with
:
>>> with open('pagehead.section.htm', 'r') as fin:
... output = fin.read()
L'instruction with
veillera à appeler la fonction __exit__
de l'objet donné même si quelque chose de mauvais s'est passé dans votre code; c'est proche de la syntaxe try... finally
. Pour l'objet renvoyé par open
, __exit__
correspond à la fermeture du fichier.
Cette déclaration a été introduite avec Python 2.6.
Pas besoin d'importer des bibliothèques spéciales pour le faire.
Utilisez la syntaxe normale et il ouvrira le fichier en lecture puis le fermera.
with open("/etc/hostname","r") as f: print f.read()
ou
with open("/etc/hosts","r") as f: x = f.read().splitlines()
qui vous donne un tableau x contenant les lignes, et peut être imprimé comme suit:
for line in x: print line
utilisez ilio : (inline io):
un seul appel de fonction à la place du fichier open (), read (), close ().
from ilio import read
content = read('filename')
with open('pagehead.section.htm')as f:contents=f.read()
Je fais souvent quelque chose comme ceci quand j'ai besoin de quelques lignes entourant quelque chose que j'ai salué dans un fichier journal:
$ grep -n "xlrd" requirements.txt | awk -F ":" '{print $1}'
54
$ python -c "with open('requirements.txt') as file: print ''.join(file.readlines()[52:55])"
wsgiref==0.1.2
xlrd==0.9.2
xlwt==0.7.5
Si vous voulez cette sensation de chaleur et de flou, allez simplement avec avec .
Pour Python 3.6, j’ai exécuté ces deux programmes sous un nouveau départ d’IDLE, en donnant aux exécutions suivantes:
0.002000093460083008 Test A
0.0020003318786621094 Test B: with guaranteed close
Donc, pas beaucoup de différence.
#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: Test A for reading a text file line-by-line into a list
#--------*---------*---------*---------*---------*---------*---------*---------*
import sys
import time
# # MAINLINE
if __== '__main__':
print("OK, starting program...")
inTextFile = '/Users/Mike/Desktop/garbage.txt'
# # Test: A: no 'with;
c=[]
start_time = time.time()
c = open(inTextFile).read().splitlines()
print("--- %s seconds ---" % (time.time() - start_time))
print("OK, program execution has ended.")
sys.exit() # END MAINLINE
SORTIE:
OK, starting program...
--- 0.002000093460083008 seconds ---
OK, program execution has ended.
#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: Test B for reading a text file line-by-line into a list
#--------*---------*---------*---------*---------*---------*---------*---------*
import sys
import time
# # MAINLINE
if __== '__main__':
print("OK, starting program...")
inTextFile = '/Users/Mike/Desktop/garbage.txt'
# # Test: B: using 'with'
c=[]
start_time = time.time()
with open(inTextFile) as D: c = D.read().splitlines()
print("--- %s seconds ---" % (time.time() - start_time))
print("OK, program execution has ended.")
sys.exit() # END MAINLINE
SORTIE:
OK, starting program...
--- 0.0020003318786621094 seconds ---
OK, program execution has ended.
En utilisant more_itertools.with_iter
, il est possible d’ouvrir, lire, fermer et assigner une output
équivalente sur une ligne (à l’exception de la déclaration d’importation):
import more_itertools as mit
output = "".join(line for line in mit.with_iter(open("pagehead.section.htm", "r")))
Bien que possible, je rechercherais une autre approche que l’affectation du contenu d’un fichier à une variable, c’est-à-dire une itération paresseuse. Cette opération peut être effectuée à l’aide d’un bloc with
traditionnel ou dans l’exemple ci-dessus en supprimant join()
et en itérant output
.