web-dev-qa-db-fra.com

Comment lire un fichier dans une liste en Python?

Je souhaite demander à un utilisateur qu'un nombre de nombres aléatoires soit généré et enregistré dans un fichier. Il nous a donné cette partie. La partie que nous devons faire est d’ouvrir ce fichier, de convertir les nombres en une liste, puis de trouver la moyenne, l’écart type, etc. sans utiliser les outils simples intégrés Python.

J'ai essayé d'utiliser open mais cela me donne une syntaxe non valide (le nom de fichier que j'ai choisi était "nombres" et il a été enregistré automatiquement dans "My Documents", alors j'ai essayé open(numbers, 'r') et open(C:\name\MyDocuments\numbers, 'r') et ni l'un ni l'autre n'a travaillé).

123
user474713
with open('C:/path/numbers.txt') as f:
    lines = f.read().splitlines()

cela vous donnera une liste de valeurs (chaînes) que vous aviez dans votre fichier, avec les nouvelles lignes supprimées.

surveillez également vos barres obliques inverses dans les noms de chemins de Windows, car ce sont également des caractères d'échappement dans les chaînes. Vous pouvez plutôt utiliser des barres obliques ou des doubles barres obliques inverses.

217
Corey Goldberg

Deux manières de lire le fichier dans la liste dans python (notez que ce n'est pas non plus ou) -

  1. utilisation de with - prise en charge à partir de python 2.5 et versions ultérieures
  2. utilisation de la compréhension de liste

1. utilisation de with

C’est la manière pythonique d’ouvrir et de lire les fichiers.

#Sample 1 - elucidating each step but not memory efficient
lines = []
with open("C:\name\MyDocuments\numbers") as file:
    for line in file: 
        line = line.strip() #or some other preprocessing
        lines.append(line) #storing everything in memory!

#Sample 2 - a more Pythonic and idiomatic way but still not memory efficient
with open("C:\name\MyDocuments\numbers") as file:
    lines = [line.strip() for line in file]

#Sample 3 - a more Pythonic way with efficient memory usage. Proper usage of with and file iterators. 
with open("C:\name\MyDocuments\numbers") as file:
    for line in file:
        line = line.strip() #preprocess line
        doSomethingWithThisLine(line) #take action on line instead of storing in a list. more memory efficient at the cost of execution speed.

la .strip() est utilisée pour chaque ligne du fichier pour supprimer le caractère de nouvelle ligne \n que chaque ligne peut avoir. Lorsque le with se termine, le fichier sera automatiquement fermé pour vous. Cela est vrai même si une exception est levée à l'intérieur de celle-ci.

2. utilisation de la compréhension de liste

Cela pourrait être considéré comme inefficace car le descripteur de fichier pourrait ne pas être fermé immédiatement. Peut-être un problème potentiel lorsque cela est appelé dans une fonction ouvrant des milliers de fichiers.

data = [line.strip() for line in open("C:/name/MyDocuments/numbers", 'r')]

Notez que la fermeture de fichier dépend de l'implémentation. Les variables normalement inutilisées sont récupérées par un interpréteur python. Dans cPython (la version de l'interprète standard de python.org), cela se produira immédiatement, car son ramasse-miettes fonctionne par comptage de références. Dans un autre interpréteur, comme Jython ou Iron Python, il peut y avoir un délai.

98
Srikar Appalaraju
f = open("file.txt")
lines = f.readlines()

Regardez par-dessus ici . readlines() renvoie une liste contenant une ligne par élément. Notez que ces lignes contiennent le \n (caractère de nouvelle ligne) à la fin de la ligne. Vous pouvez supprimer ce caractère de nouvelle ligne en utilisant la méthode strip()-. C'est à dire. appelez lines[index].strip() pour obtenir la chaîne sans le caractère de nouvelle ligne.

Comme l'a noté joaquin, n'oubliez pas de f.close() le fichier.

La conversion de strint en nombres entiers est facile: int("12").

53
phimuemue

La façon pythonique de lire un fichier et de mettre toutes les lignes dans une liste:

from __future__ import with_statement #for python 2.5
with open('C:/path/numbers.txt', 'r') as f:
    lines = f.readlines()

Ensuite, en supposant que chaque ligne contient un nombre,

numbers =[int(e.strip()) for e in lines]
14
ohe

Vous devez passer une chaîne de nom de fichier à open. Il y a une complication supplémentaire lorsque la chaîne contient \, car il s'agit d'un caractère d'échappement spécial pour Python. Vous pouvez résoudre ce problème en doublant chacun en tant que \\ ou en plaçant un r devant la chaîne comme suit: r'C:\name\MyDocuments\numbers'.

Edit: Les modifications apportées à la question la rendent complètement différente de l'originale, et comme aucune d'entre elles ne provenait de l'affiche originale, je ne suis pas sûre qu'elles soient protégées. Cependant, cela indique une chose évidente qui aurait pu être négligée, c'est comment ajouter "Mes documents" à un nom de fichier.

Dans une version anglaise de Windows XP, My Documents est en réalité C:\Documents and Settings\name\My Documents. Cela signifie que l'appel open devrait ressembler à ceci:

open(r"C:\Documents and Settings\name\My Documents\numbers", 'r')

Je suppose que vous utilisez XP parce que vous l'appelez My Documents - cela a changé sous Vista et Windows 7. Je ne sais pas s'il existe un moyen simple de rechercher cela automatiquement dans Python.

8
Mark Ransom
hdl = open("C:/name/MyDocuments/numbers", 'r')
milist = hdl.readlines()
hdl.close()
5
joaquin

Pour résumer un peu de ce que les gens ont dit:

f=open('data.txt', 'w') # will make a new file or erase a file of that name if it is present
f=open('data.txt', 'r') # will open a file as read-only
f=open('data.txt', 'a') # will open a file for appending (appended data goes to the end of the file)

Si vous souhaitez avoir quelque chose en place semblable à un essai/attraper

with open('data.txt') as f:
    for line in f:
        print line

Je pense que le code @movieyoda est probablement ce que vous devriez utiliser cependant

4
Tom

Si vous avez plusieurs numéros par ligne et plusieurs lignes, vous pouvez les lire comme suit:

    #!/usr/bin/env python

    from os.path import dirname

    with open(dirname(__file__) + '/data/path/filename.txt') as input_data:
        input_list= [map(int,num.split()) for num in input_data.readlines()]
0
Stefan Gruenwald