web-dev-qa-db-fra.com

Supprimer le caractère de nouvelle ligne d'une liste lue d'un fichier

J'ai un programme simple qui prend un numéro d'identification et imprime des informations pour la personne correspondant à l'identifiant. Les informations sont stockées dans un fichier .dat, avec un numéro d'identification par ligne.

Le problème est que mon programme lit également le caractère de nouvelle ligne\n à partir du fichier. J'ai essayé la méthode 'name'.split (), mais cela ne semble pas fonctionner pour une liste.

Mon programme:

from time import localtime, strftime

files = open("grades.dat")
request = open("requests.dat", "w")
lists = files.readlines()
grades = []

for i in range(len(lists)):
    grades.append(lists[i].split(","))

cont = "y"

while cont == "y" or cont == "Y":
    answer = raw_input("Please enter the Student I.D. of whom you are looking: ")
    for i in range(len(grades)):
        if answer == grades[i][0]:
            print grades[i][1] + ", " + grades[i][2] + (" "*6) + grades[i][0] + (" "*6) + grades[i][3]
            time = strftime("%a, %b %d %Y %H:%M:%S", localtime())
            print time
            print "Exams - " + grades[i][11] + ", " + grades[i][12] + ", " + grades[i][13]
            print "Homework - " + grades[i][4] + ", " + grades[i][5] + ", " + grades[i][6] + ", " + grades[i][7] + ", " +grades[i][8] + ", " + grades[i][9] + ", " + grades[i][10]
            total = int(grades[i][4]) + int(grades[i][5]) + int(grades[i][6]) + int(grades[i][7]) + int(grades[i][8]) + int(grades[i][9]) + int(grades[i][10]) + int(grades[i][11]) + int(grades[i][12]) + int(grades[i][13])
            print "Total points earned - " + str(total)
            grade = float(total) / 550
            grade = grade * 100
            if grade >= 90:
                print "Grade: " + str(grade) + ", that is equal to an A."
            Elif grade >= 80 and grade < 90:
                print "Grade: " + str('%.2f' %grade) + ", that is equal to a B."
            Elif grade >= 70 and grade < 80:
                print "Grade: " + str('%.2f' %grade) + ", that is equal to a C."
            Elif grade >= 60 and grade < 70:
                print "Grade: " + str('%.2f' %grade) + ", that is equal to a D."
            else:
                print "Grade: " + str('%.2f' %grade) + ", that is equal to an F."
            request.write(grades[i][0] + " " + grades[i][1] + ", " + grades [i][2] +
                          " " + time)
            request.write("\n")


    print
    cont = raw_input("Would you like to search again? ")

if cont != "y" or cont != "Y":
    print "Goodbye."
35
Python Newbie

str.strip() renvoie une chaîne avec les espaces blancs + fin supprimés, .lstrip et .rstrip pour seulement le début et la fin.

grades.append(lists[i].rstrip('\n').split(','))
76
ephemient

Vous pouvez utiliser la fonction strip() pour supprimer les espaces finaux (et précédants); en lui passant un argument vous permettra de spécifier quel espace:

for i in range(len(lists)):
    grades.append(lists[i].strip('\n'))

Il semblerait que vous puissiez simplement simplifier l’ensemble du bloc, car si votre fichier stocke un ID par ligne, grades n’est que lists avec les nouvelles lignes supprimées:

Avant

lists = files.readlines()
grades = []

for i in range(len(lists)):
    grades.append(lists[i].split(","))

Après

grades = [x.strip() for x in files.readlines()]

(ce qui précède est un compréhension de la liste )


Enfin, vous pouvez parcourir directement une liste au lieu d'utiliser un index:

Avant

for i in range(len(grades)):
    # do something with grades[i]

Après

for thisGrade in grades:
    # do something with thisGrade
17
Michael Mrozek

Vous pouvez réellement utiliser les sauts de lignes en lisant l'intégralité du fichier en mémoire sous la forme d'une longue chaîne, puis les utiliser pour le scinder dans la liste des notes.

with open("grades.dat") as input:
    grades = [line.split(",") for line in input.read().splitlines()]
etc...
4
martineau

Voici différentes optimisations et applications du style propre Python) pour rendre votre code plus ordonné. J'ai ajouté du code optionnel à l'aide du module csv qui est plus souhaitable que J'ai aussi ajouté un peu de namedtuple bonté, mais je n'utilise pas les attributs fournis par la suite. Les noms des parties de la nommée sont inexacts, vous devrez les corriger.

import csv
from collections import namedtuple
from time import localtime, strftime

# Method one, reading the file into lists manually (less desirable)
with open('grades.dat') as files:
    grades = [[e.strip() for e in s.split(',')] for s in files]

# Method two, using csv and namedtuple
StudentRecord = namedtuple('StudentRecord', 'id, lastname, firstname, something, homework1, homework2, homework3, homework4, homework5, homework6, homework7, exam1, exam2, exam3')
grades = map(StudentRecord._make, csv.reader(open('grades.dat')))
# Now you could have student.id, student.lastname, etc.
# Skipping the namedtuple, you could do grades = map(Tuple, csv.reader(open('grades.dat')))

request = open('requests.dat', 'w')
cont = 'y'

while cont.lower() == 'y':
    answer = raw_input('Please enter the Student I.D. of whom you are looking: ')
    for student in grades:
        if answer == student[0]:
            print '%s, %s      %s      %s' % (student[1], student[2], student[0], student[3])
            time = strftime('%a, %b %d %Y %H:%M:%S', localtime())
            print time
            print 'Exams - %s, %s, %s' % student[11:14]
            print 'Homework - %s, %s, %s, %s, %s, %s, %s' % student[4:11]
            total = sum(int(x) for x in student[4:14])
            print 'Total points earned - %d' % total
            grade = total / 5.5
            if grade >= 90:
                letter = 'an A'
            Elif grade >= 80:
                letter = 'a B'
            Elif grade >= 70:
                letter = 'a C'
            Elif grade >= 60:
                letter = 'a D'
            else:
                letter = 'an F'

            if letter = 'an A':
                print 'Grade: %s, that is equal to %s.' % (grade, letter)
            else:
                print 'Grade: %.2f, that is equal to %s.' % (grade, letter)

            request.write('%s %s, %s %s\n' % (student[0], student[1], student[2], time))


    print
    cont = raw_input('Would you like to search again? ')

print 'Goodbye.'
2
Chris Morgan

Vous voulez la fonction String.strip (s [ chars]), qui supprimera les caractères d'espacement ou les caractères (tels que '\ n') que vous spécifiez dans l'argument chars.

Voir http://docs.python.org/release/2.3/lib/module-string.html

0
DGH