101 votes

Moyen le plus simple de lire / écrire le contenu d'un fichier en Python

En Ruby, vous pouvez lire à partir d'un fichier à l'aide d' s = File.read(filename). Le plus court et le plus clair je sais en Python est

with file(filename) as f:
    s = f.read()

Est-il un autre moyen de le faire qui le rend encore plus courte (de préférence sur une ligne) et plus lisible?

Note: au départ, j'ai formulé la question "cela en une seule ligne de code". Comme indiqué par S. Lott, plus courte ne signifie pas nécessairement la plus lisible. Donc, j'ai reformulé ma question, juste pour rendre clair ce que je voulais dire. Je pense que le code Ruby est mieux et plus lisible, pas nécessairement parce que c'est une seule ligne au lieu de deux (bien que les choses ainsi), mais aussi parce que c'est une méthode de classe, par opposition à une méthode d'instance, ce qui ne pose pas de question sur qui ferme le fichier, comment faire en sorte qu'il soit fermé, même si une exception est levée, etc. Comme indiqué dans les réponses ci-dessous, vous pouvez compter sur le gouvernement pour fermer votre fichier (donc ce qui en fait un one-liner), mais qui rend le code pour le pire, même si c'est plus court. Non seulement par le fait d'être portables, mais en la rendant incertaine.

171voto

Mark Tolonen Points 32702
 with open('x.py') as f: s = f.read()
 

*** sourires ***

41voto

pyfunc Points 31088

C'est la même chose que ci-dessus mais ne gère pas les erreurs:

 s = open(filename, 'r').read()
 

19voto

ars Points 35803
contents = open(filename).read()

11voto

Glenn Maynard Points 24451

Ce n'est pas Perl; vous ne voulez pas forcer l'ajustement de plusieurs lignes de code sur une seule ligne. Écrivez une fonction, puis appeler la fonction prend une ligne de code.

 def read_file(fn):
    """
    >>> import os
    >>> fn = "/tmp/testfile.%i" % os.getpid()
    >>> open(fn, "w+").write("testing")
    >>> read_file(fn)
    'testing'
    >>> os.unlink(fn)
    >>> read_file("/nonexistant")
    Traceback (most recent call last):
        ...
    IOError: [Errno 2] No such file or directory: '/nonexistant'
    """
    with open(fn) as f:
        return f.read()

if __name__ == "__main__":
    import doctest
    doctest.testmod()
 

10voto

snapshoe Points 3455

Si vous êtes ouvert à l'utilisation de bibliothèques, essayez d'installer forked-path (avec easy_install ou pip).

Ensuite, vous pouvez faire:

 from path import path
s = path(filename).bytes()
 

Cette bibliothèque est assez nouvelle, mais c'est un fork d'une bibliothèque qui flotte autour de Python depuis des années et qui a été assez utilisée. Depuis que j'ai trouvé cette bibliothèque il y a des années, j'utilise très rarement os.path ou open() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X