web-dev-qa-db-fra.com

ouvrir lire et fermer un fichier dans 1 ligne de code

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?

90
1qazxsw2

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.

145
Tim Pietzcker

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'

Sur Python 27, installez backported pathlib ou pathlib2

30
Janusz Skonieczny

À 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:

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

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

19
Sven Marnach

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.

9
Joël

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

Ces one-liners sont très utiles pour la maintenance, essentiellement auto-documentés.

8
SDsolar

utilisez ilio : (inline io):

un seul appel de fonction à la place du fichier open (), read (), close ().

from ilio import read

content = read('filename')
5
iman
with open('pagehead.section.htm')as f:contents=f.read()
3
user7050005

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
0
Matthew Purdon

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

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.

0
pylang