Pratiquer un peu de python et j'essaie de résoudre un problème qui demande à obtenir l'âge moyen des étudiants dans un fichier texte. Ex. du fichier .txt illustré ci-dessous.
def sumNums():
infile = open('student_age.txt', 'r')
fileContents = infile.read()
infile.close
count= 0
for lines in fileContents.split(','):
if lines.isdigit():
count += lines
print(sum(count) / len(lines))
5 Réponses :
Démarrer plus simple. Commencez simplement en écrivant simplement un code qui ira sur les lignes d'un fichier séparé par des virgules, comme celui-ci et imprimez la deuxième valeur (le nombre) de chaque ligne.
import csv
with open('path/to/file.csv') as f:
reader = csv.reader(f)
numbers = [int(num) for _, num in reader]
total, count = sum(numbers), len(numbers)
result = total / count
Les extensions de fichier @jackrabbit sont toujours arbitraires (dans l'informatique moderne). Tant que les données sous-jacentes sont formatées identiques, peu importe si c'est un file.csv code> ou a fichier.txt code> ou a fichier fichier.zip < / code> ou a fichier.exe code>.
Cela a été une tonne d'aide, merci Adam! J'essaie d'apprendre les fondamentaux de Python avant de plonger dans des modules comme CSV, mais je sais à quel point ils sont puissants et il est trop tentant de les utiliser!
@jackrabbit génial! Je pense que l'apprentissage des premiers principes est important, mais n'oubliez pas que vous ne verrez jamais de code réel qui ressemble à cela, et si vous écrivez du code qui ressemble à ce que cela sera rejeté en revue (ou pire: non rejeté examiner et devenir une dette technique qui fait mal à la main-d'œuvre). Il y a un contraste tranchant entre le type de code que vous écrivez pour comprendre un concept et le type de code que vous écrivez une fois que vous i> do i> comprend ce concept, et jamais le Twain ne se réunira.
Essayez Utiliser
sum("age")/len("age")
Pourquoi int (float (...)) code>? Pourquoi pas seulement int (...) code>?
Oh, cela peut aussi fonctionner, je n'ai jamais essayé cela, je travaille habituellement avec des flotteurs, alors je viens de l'étendre par int ()
Vous devriez essayer de vous échapper avec des flotteurs si possible. Ils sont une structure de données stupide :)
Vous traitez de manière incorrecte votre fichier. mais il y a une meilleure solution ... P> < P> pandas ! p> trois lignes de code et Vous êtes le roi. P> p> infile.read () code> retourne toutes les lignes du fichier. Donc, vous devriez d'abord le scinder par '\ n' code> et par ',':
En utilisant des pandas ici, c'est comme utiliser une zone nucléaire pour commencer un feu de camp. Soulignant également filecontents = infileume.read (); Pour la ligne dans les filecontents.split ('\ n') code> semble idiot quand il y a filelines = infile.readlines () code> qui fait tout cela pour vous.
Une zone nucléaire qui n'est pas aussi fragile que la lecture manuelle CSV (essayez d'ajouter une autre colonne dans le fichier et votre solution sera cassée). De plus, il permet à l'OP de manipuler les données bien meilleures que le module CSV code>.
Personne ne fait valoir que la tête nucléaire n'est pas bien conçue, c'est-à-dire qu'elle est excessive de cette tâche. C'est assez clair une question posée par un débutant qui a des problèmes avec un tutoriel. "Oh, lancer des pandas à ce sujet" n'est pas une recommandation utile si quelqu'un essaie d'apprendre Python.
(Et notamment: votre solution est cassée aussi si vous ajoutez une colonne précédente)
Voici une autre façon d'accomplir cette tâche:
def average_age(lst):
return sum(lst) / len(lst)
# list comprehension that reads the input file, splits the lines and extracts the age
# from each line
ages = ([int(age[1].strip()) for age in (line.split(",") for line in open('tmpFile.txt', 'r').readlines())])
average = average_age(ages)
print(f'Average age = {int(round(average, 2))}')
# outputs
Average age = 21
def sumNums():
with open('student_age.txt', 'r') as f:
count = i = 0
for line in f:
name, number = line.split(',')
if number.strip().isdigit():
count += int(number)
i += 1
print(count / i)
sumNums()
Tout d'abord,
infile.close code> ne fait rien. Si vous souhaitez fermer le fichier, vous devez l'appelerinfile.close () code>. Deuxièmement, dans votre échantillon, vous n'avez qu'une seule virgule, code>, telle que les scissions échouent pour la plupart des lignes. Troisièmement, vous avez beaucoup de\ n code> masqué dans votrefilecontents code>, telle quedivisé ('') code> donnerait quelque chose comme[ 'Sam', '23 \ njack', '20'] code> etc. alors,isdigit () code> serait toujoursfalse code> et le compte+ = = Les lignes code> ne seraient jamais atteintes. Vous voudrez peut-être utiliserReadlines code> au lieu delire code> et scinder par, code> (avec un espace supplémentaire)