web-dev-qa-db-ja.com

ファイルから読み取ったリスト内の改行文字を削除します

ID番号を取得し、IDに一致する人の情報を出力する簡単なプログラムがあります。情報は.datファイルに保存され、1行に1つのID番号が付けられます。

問題は、私のプログラムもファイルから改行文字\ nを読み取っていることです。 「name」.split()メソッドを試しましたが、これはリストに対して機能しないようです。

私のプログラム:

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()は、先頭と末尾の空白を削除した文字列を返します。.lstripおよび.rstripそれぞれ先頭と末尾のみ。

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

strip()関数を使用して、末尾(および先頭)の空白を削除できます。引数を渡すと、どの空白を指定することができます:

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

ただし、ファイルに1行に1つのIDが格納されている場合、gradesは改行を除いたlistsであるため、ブロック全体を単純化できるように見えます。

lists = files.readlines()
grades = []

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

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

(上記は リスト内包表記 です)


最後に、インデックスを使用する代わりに、リストを直接ループできます。

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

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

実際には、ファイル全体を単一の長い文字列としてメモリに読み込んで、それらを使用してグレードのリストに分割することにより、改行を有効に使用できます。

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

適切なPythonスタイルを使用してコードをすっきりさせるためのさまざまな最適化とアプリケーションがあります。私はcsvモジュールを使用してオプションのコードを追加しました。手動で解析します。また、少し namedtuple goodnessを入力しましたが、その後提供する属性は使用しません。namedtupleの各部分の名前は不正確です。それらを修正する必要があります。

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

String.strip(s [、chars])関数が必要です。この関数は、空白文字またはchars引数で指定した任意の文字( '\ n'など)を取り除きます。

http://docs.python.org/release/2.3/lib/module-string.html を参照してください

0
DGH