0
votes

Comment trouver la moyenne d'une colonne dans un fichier texte à Python?

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))


1 commentaires

Tout d'abord, infile.close ne fait rien. Si vous souhaitez fermer le fichier, vous devez l'appeler infile.close () . Deuxièmement, dans votre échantillon, vous n'avez qu'une seule virgule , , telle que les scissions échouent pour la plupart des lignes. Troisièmement, vous avez beaucoup de \ n masqué dans votre filecontents , telle que divisé ('') donnerait quelque chose comme [ 'Sam', '23 \ njack', '20'] etc. alors, isdigit () serait toujours false et le compte + = = Les lignes ne seraient jamais atteintes. Vous voudrez peut-être utiliser Readlines au lieu de lire et scinder par , (avec un espace supplémentaire)


5 Réponses :


0
votes

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


3 commentaires

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 ou a fichier.txt ou a fichier fichier.zip < / code> ou a fichier.exe .


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 do comprend ce concept, et jamais le Twain ne se réunira.



0
votes

Essayez Utiliser

sum("age")/len("age")


3 commentaires

Pourquoi int (float (...)) ? Pourquoi pas seulement int (...) ?


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



-1
votes

Vous traitez de manière incorrecte votre fichier. infile.read () retourne toutes les lignes du fichier. Donc, vous devriez d'abord le scinder par '\ n' et par ',': xxx

mais il y a une meilleure solution ... < P> pandas ! xxx

trois lignes de code et Vous êtes le roi.


4 commentaires

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') semble idiot quand il y a filelines = infile.readlines () 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 .


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)



0
votes

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


0 commentaires

0
votes
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()

0 commentaires