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é).
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.
Deux manières de lire le fichier dans la liste dans python (notez que ce n'est pas non plus ou) -
with
- prise en charge à partir de python 2.5 et versions ultérieureswith
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.
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.
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")
.
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]
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.
hdl = open("C:/name/MyDocuments/numbers", 'r')
milist = hdl.readlines()
hdl.close()
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
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()]