让我的输出看起来有问题吗

2024-05-28 18:41:33 发布

您现在位置:Python中文网/ 问答频道 /正文

感谢您查看我的问题,并提前感谢您提供的任何帮助。 我正在写一个程序,从txt文件中读取行,然后以某种方式打印输出。他们都在这儿

这是我正在读的txt文件

JOE FRITZ           AMERICAN GOVERNMENT           B
JOE FRITZ           CALCULUS I                    A
JOE FRITZ           COMPUTER PROGRAMMING          B
JOE FRITZ           ENGLISH COMPOSITION           A
LANE SMITH          FUND. OF DATA PROCESSING      B
LANE SMITH          INTERMEDIATE SWIMMING         A
LANE SMITH          INTRO. TO BUSINESS            C
JOHN SPITZ          CHOIR                         C
JOHN SPITZ          COLLEGE STATISTICS            B
JOHN SPITZ          ENGLISH LITERATURE            D
JOHN SPITZ          INTRO. TO BUSINESS            B

我试图让我的输出看起来像这样:

                       GRADE REPORT

NAME                COURSE                            GRADE
-----------------------------------------------------------
JOE FRITZ           AMERICAN GOVERNMENT                 B
                    CALCULUS I                          A
                    COMPUTER PROGRAMMING                B
                    ENGLISH COMPOSITION                 A
                    Total courses taken = 4

LANE SMITH          FUND. OF DATA PROCESSING            B
                    INTERMEDIATE SWIMMING               A
                    INTRO. TO BUSINESS                  C
                    Total courses taken = 3

JOHN SPITZ          CHOIR                               C
                    COLLEGE STATISTICS                  B
                    ENGLISH LITERATURE                  D
                    INTRO. TO BUSINESS                  B
                    Total courses taken = 4

Total courses taken by all students = 11

Run complete.  Press the Enter key to exit.

编辑

多亏了你的帮助,我完成了这个项目。你知道吗

我知道这可能很难看,但我很高兴有正确的输出。你知道吗

以下是显示正确输出的源代码:

#-----------------------------------------------------------------------
# VARIABLE DEFINITIONS

name = ""
previousName = ""
course = ""
grade = ""
grandTotal = 0
courseCount = 0
eof = False

#-----------------------------------------------------------------------
# CONSTANT DEFINITIONS

#-----------------------------------------------------------------------
# FUNCTION DEFINITIONS

def startUp():
    global gradeFile, grandTotal,courseCount, previousName, name
    grandTotal = 0
    courseCount = 0
    gradeFile = open("grades.txt","r")
    print
    print ("grade report\n").center(60).upper()
    print "name".upper(),"course".rjust(21).upper(),"grade".rjust(33).upper()
    print "-" * 60
    readRecord()


def readRecord():
    global name, course, grade, eof, courseCount

    studentRecord = gradeFile.readline()
    if studentRecord == "":
        eof = True
    else:
        name = studentRecord[0:20]
        course = studentRecord[20:50]
        grade = studentRecord[50:51]
        eof = False

def processRecords():
    global courseCount, previousName, name, grandTotal
    while not eof:
        if name != previousName:
            if name == "JOE FRITZ           ":
                courseCount = 0
                print name + course + "       " + grade
                previousName = name
                courseCount += 1
            else:
                print "\t\t    Total courses taken =",courseCount 
                print
                courseCount = 0
                print name + course + "       " + grade
                previousName = name
                courseCount += 1
        else:
            print (" " * 20) + course + "       " + grade
            courseCount += 1
        grandTotal +=1
        readRecord()
    print "\t\t    Total courses taken =",courseCount


def closeUp():
    gradeFile.close()
    print "\nTotal courses taken by all students =",grandTotal

#-----------------------------------------------------------------------
# PROGRAM'S MAIN LOGIC

startUp()
processRecords()
closeUp()

raw_input("\nRun complete. Press the Enter key to exit.")

谢谢大家的帮助。我真的很感激。抱歉,如果我在这个过程中让任何人失望了。祝你过得愉快。和平


Tags: namejohntakentotalgradeprintjoecourse
0条回答
网友
1楼 · 发布于 2024-05-28 18:41:33

我只是在函数readRecord()中找出了代码中的一个错误,您只是在读取文件的第一行而已;您应该循环所有行或使readRecord()成为生成器。你知道吗

  def readRecord():
     global name, course, grade, eof

     studentRecord = gradeFile.readline()  # <  - HERE

     if studentRecord == "":
        eof = True
     else:
        name = studentRecord[0:20]
        course = studentRecord[20:50]
        grade = studentRecord[50:51]
        eof = False

但尽管如此,说实话,我不太喜欢你的代码,如果我是你,我会这么做:

1)通过任何方式(csv,regex…)从文件中获取数据;我想我们已经在here中找到了答案

2)把数据放在字典里或别的什么地方(这样你就可以随时处理它们)。你知道吗

3)使用itertools.groupby()按学生分组并计算所需内容的总和。你知道吗

4)使用字符串Template(),因为格式可能会改变,不要像以前那样硬编码输出的格式。你知道吗

请在编写完函数后,逐个测试你的函数,因为如果不这样做,很难找出代码的哪一部分不起作用。你知道吗

编辑:

我不会问你为什么要这样做,因为如果你想再次把它们放进一个文件,你会遇到和以前一样的问题,如果你想再次检索它们,如果你的目标只是制作一个漂亮的输出,我会问你值得吗?你知道吗

最后一个建议是使用众所周知的格式,如csv,xml。。。你知道吗

祝你好运:)

网友
2楼 · 发布于 2024-05-28 18:41:33

这可能不是上世纪60年代你愚昧的导师希望你这样做的科波洛克方式,但总的想法是:

(1)itertools.groupby可以保存所有先前/当前检测名称更改的malarky

(2)您应该先将数据记录提取成一种合理的格式,去掉尾随空格(总是一个好主意)以除去不属于数据的多余换行符

(3)像您这样使用的全局变量是outter pox(在任何语言中)。你知道吗

import itertools

guff = """\
JOE FRITZ           AMERICAN GOVERNMENT           B
JOE FRITZ           CALCULUS I                    A
JOE FRITZ           COMPUTER PROGRAMMING          B
JOE FRITZ           ENGLISH COMPOSITION           A
LANE SMITH          FUND. OF DATA PROCESSING      B
LANE SMITH          INTERMEDIATE SWIMMING         A
LANE SMITH          INTRO. TO BUSINESS            C
JOHN SPITZ          CHOIR                         C
JOHN SPITZ          COLLEGE STATISTICS            B
JOHN SPITZ          ENGLISH LITERATURE            D
JOHN SPITZ          INTRO. TO BUSINESS            B
"""

data_source = guff.splitlines(True) # simulate file

columns = (slice(0, 20), slice(20, 50), slice(50, 51))

def data_reader(raw_record_iterator):
    for line in raw_record_iterator:
        yield [line[sl].rstrip() for sl in columns]

def process_file():

    # f = open('my_file.text', 'r')
    # or use a 'with' statement
    # data_source = f

    for key, grouper in itertools.groupby(
            data_reader(data_source), lambda element: element[0]):
        print "=== start student %s ===" % key
        for cooked_record in grouper:
            print cooked_record
        print "=== end student %s ===" % key
    print "=== Grand totals here ==="
    # f.close()

if __name__ == "__main__":
    process_file()

实际输出:

=== start student JOE FRITZ ===
['JOE FRITZ', 'AMERICAN GOVERNMENT', 'B']
['JOE FRITZ', 'CALCULUS I', 'A']
['JOE FRITZ', 'COMPUTER PROGRAMMING', 'B']
['JOE FRITZ', 'ENGLISH COMPOSITION', 'A']
=== end student JOE FRITZ ===
=== start student LANE SMITH ===
['LANE SMITH', 'FUND. OF DATA PROCESSING', 'B']
['LANE SMITH', 'INTERMEDIATE SWIMMING', 'A']
['LANE SMITH', 'INTRO. TO BUSINESS', 'C']
=== end student LANE SMITH ===
=== start student JOHN SPITZ ===
['JOHN SPITZ', 'CHOIR', 'C']
['JOHN SPITZ', 'COLLEGE STATISTICS', 'B']
['JOHN SPITZ', 'ENGLISH LITERATURE', 'D']
['JOHN SPITZ', 'INTRO. TO BUSINESS', 'B']
=== end student JOHN SPITZ ===
=== Grand totals here ===

相关问题 更多 >

    热门问题