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."
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(','))
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:
lists = files.readlines()
grades = []
for i in range(len(lists)):
grades.append(lists[i].split(","))
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:
for i in range(len(grades)):
# do something with grades[i]
for thisGrade in grades:
# do something with thisGrade
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...
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.'
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