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()
Lorsque vous utilisez la syntaxe ci-dessus, comment fermer le fichier pour libérer des ressources système?
contents = os.readfile(path)
. Si je voulais faire quelque chose de plus sophistiqué, alors d'accord, j'utiliserais volontierswith open(path) as fd: contents = fd.read()
. Bien sûr, on peut écrire son propre wrapper, mais c'est à cela que sert le noyau, pour fournir l'utile aux abstractions aux programmeurs.Réponses:
Vous n'avez pas vraiment besoin de le fermer - Python le fera automatiquement pendant le ramasse-miettes ou à la sortie du programme. Mais comme @delnan l'a noté, il est préférable de le fermer explicitement pour diverses raisons.
Alors, que pouvez-vous faire pour rester bref, simple et explicite:
Maintenant, c'est juste deux lignes et assez lisible, je pense.
la source
with
instruction, la ressource de fichier sera fermée correctement pour vous.output = f.read()
pièce sur la même ligne après le:
.Le module Pathlib de la bibliothèque standard de Python fait ce que vous recherchez:
N'oubliez pas d'importer le chemin:
Sur Python 27, installez rétroporté
pathlib
oupathlib2
la source
with
sont très bien, maiswith
c'est une déclaration, pas une expression. Cettepathlib
réponse est la seule réponse à la question d'origine qui peut être intégrée dans une expression Python. Quelque chose commeSECRET_KEY = os.environ.get('SECRET_KEY') or pathlib.Path('SECRET_KEY').read_bytes()
En utilisant CPython, votre fichier sera fermé immédiatement après l'exécution de la ligne, car l'objet fichier est immédiatement récupéré. Il y a cependant deux inconvénients:
Dans les implémentations Python différentes de CPython, le fichier n'est souvent pas immédiatement fermé, mais plutôt à un moment ultérieur, hors de votre contrôle.
Dans Python 3.2 ou supérieur, cela lancera un
ResourceWarning
, s'il est activé.Mieux vaut investir une ligne supplémentaire:
Cela garantira que le fichier est correctement fermé en toutes circonstances.
la source
Pas besoin d'importer de bibliothèques spéciales pour ce faire.
Utilisez la syntaxe normale et il ouvrira le fichier pour la lecture puis le fermera.
ou
qui vous donne un tableau x contenant les lignes, et peut être imprimé comme ceci:
Ces one-liners sont très utiles pour la maintenance - essentiellement auto-documentés.
la source
Ce que vous pouvez faire est d'utiliser l'
with
instruction et d'écrire les deux étapes sur une seule ligne:L'
with
instruction prendra soin d'appeler la__exit__
fonction de l'objet donné même si quelque chose de mauvais s'est produit dans votre code; c'est proche de latry... finally
syntaxe. Pour l'objet renvoyé paropen
,__exit__
correspond à la fermeture du fichier.Cette déclaration a été introduite avec Python 2.6.
la source
with
été introduit dans Python 2.5, mais a dû être importé explicitement depuis__future__
. Il est devenu disponible dans tous les contextes de Python 2.6.utilisez ilio : (inline io):
juste un appel de fonction au lieu de fichier open (), read (), close ().
la source
la source
python -c
la ligne de commande, donc publier des réponses sur 2 lignes n'aide pas."
, utiliser;
pour ajouter deux instructions et supprimer une nouvelle ligne après:
? L'expression suivante fonctionne très bien pour moi:$> python -c "with open('some file', 'r') as f: print(next(f))"
Je pense que le moyen le plus naturel pour y parvenir est de définir une fonction.
Ensuite, vous pouvez effectuer les opérations suivantes:
la source
Je fais souvent quelque chose comme ça lorsque j'ai besoin de quelques lignes entourant quelque chose que j'ai greffé dans un fichier journal:
la source
grep -A <n>
,grep -B <n>
etgrep -C <n>
, si elle est utile. Plus d'infos: stackoverflow.com/a/9083/1830159En utilisant
more_itertools.with_iter
, il est possible d'ouvrir, lire, fermer et affecter un équivalentoutput
en une seule ligne (hors instruction d'importation):Bien que possible, je chercherais une autre approche autre que d'assigner le contenu d'un fichier à une variable, c'est-à-dire une itération paresseuse - cela peut être fait en utilisant un
with
bloc traditionnel ou dans l'exemple ci-dessus en supprimantjoin()
et en itérantoutput
.la source
"".join(line for line in __import__('more_itertools').with_iter(open("pagehead.section.htm", "r")))
Cela fonctionne très bien et élimine le besoin d'une ligne pour l'importation.Si vous voulez que chaud et floue sentiment juste aller avec avec .
Pour python 3.6, j'ai exécuté ces deux programmes sous un nouveau départ d'IDLE, donnant des temps d'exécution de:
Donc pas beaucoup de différence.
PRODUCTION:
PRODUCTION:
la source