从文本文件中提取数据

时间:2012-11-08 19:32:42

标签: python python-3.x text-files extraction

我有以下输入:

ID,       Last,      First,   Lecture, Tutorial, A1,  A2, A3,   A4,  A5
10034567, Smith,     Winston, L01,     T03,      6,   5.5, 8,   10,  8.5
10045678, Lee,       Bruce,   L02,     T05,      4.5, 6.5, 7,   7,   8.5
00305678, Obama,     Jack,    L01,     T05,      10,  10,  9,   9.5, 10
00567890, Brown,     Palin,   L02,     T03,      4,   7.5, 6.5, 0,   5
10012134, Harper,    Ed,      L01,     T03,      10,  9,   7.5, 10,  6.5
10014549, Johnson,   Andrew,  L01,     T05,      10,  0,   10,  5.5, 7
10020987, Clockwork, Milan,   L02,     T03,      10,  8.5, 8,   9,   9
10021234, Freeman,   Skyski   L01,     T02,      0,   10,  10,  10,  8.5
EOF

文件的第一行说明了数据的每一列。设n为学生总数,然后文件的下n行分别对应于班级中的学生,并包含10个字段:

  1. 学生证

  2. 姓氏

  3. 名字

  4. 讲座部分

  5. 教程sectiom

  6. 作业1 的等级(依此类推......)

  7. 假设成绩存储在文件grades.txt中,那么您可以使用以下Python语句将整行文件读入Python字符串:

    file = open (‘grades.txt’, ‘r’)
    s = file.readline()
    

    您只需要打开一次文件,然后就可以多次使用readline()功能,每次都读取一行。在n行学生记录之后,该文件以最后一行结束,该行显示EOF End of File的缩写。

    数字n不是优先级。样本输入并不重要,它可以包含100到300名学生,在一个名为grades.txt的文件中我们希望最终为作业1的等级分布绘制直方图。因此,您需要提取 每个学生的A1等级,通过处理他/她在文件中的相应行。构建一个列表,每个学生都有一个条目,存储他/她的A1等级。每次提取新的A1等级时,请将其附加到此列表中。

    到目前为止,这就是我所做的:

    file = open('grades.txt','r')
    s = file.readline()
    
    
    for line in file:
        newline = str(line)
        grades = newline.split(",")
        if len(grades)<=4:
            break
        elif len(grades)>5:
            break
        else:
            grades = [float(x) for x in grades]
    gradeA1 = grades[5]
    print(gradeA1)
    

    但是我只获得了第一年级6而不是任何连续行的其他A1等级,所有A1等级都应该编成一个列表。

    我将此作为我编辑过的代码,但仍然出现错误。

    file = open('grades.txt','r')
    s = file.readline()
    
    for s in file:
        s = file.readline()
        grades = s.split(",")
        if grades=='EOF\n':
            break
    A1grades = [float(x) for x in grades[5]]   
    print(A1grades)
    

    我的索引超出范围错误。

3 个答案:

答案 0 :(得分:1)

对于任何格式良好的数据,csv模块是一个很好的起点 - 我建议你阅读一下这个文档,然后试一试。应该让你朝着正确的方向前进。否则,我怀疑你对你的列表有什么困惑 - 最近一行的结果列表或行列表。代码目前在每一行重新创建成绩,这可能不是你想要做的......

答案 1 :(得分:1)

我认为问题可能是你没有从文件中读取所有行... 也许你可以做这样的事情

firstLine = file.readline()
#extract from first line, the number of lines that next

for x in range(1,number_of_line)
    line = file.readline()
    #process the information for all next lines

这是一种方法,希望这可以帮助你......

答案 2 :(得分:1)

我可能会弄错,但是,有了这个输入:

ID,       Last,      First,   Lecture, Tutorial, A1,  A2, A3,   A4,  A5
10034567, Smith,     Winston, L01,     T03,      6,   5.5, 8,   10,  8.5
10045678, Lee,       Bruce,   L02,     T05,      4.5, 6.5, 7,   7,   8.5
00305678, Obama,     Jack,    L01,     T05,      10,  10,  9,   9.5, 10

和这个(部分)代码:

for line in file:
    newline = str(line)
    grades = newline.split(",")
    if len(grades)<=4:
        break
    elif len(grades)>5:
        break

当只有5列时,你只能保持循环。我数10列(用逗号分隔)。因此,您在第一行之后立即中断(从不将成绩转换为浮点数),只从第一行获得结果。

您的代码中还有其他一些错误,但您可能需要先解决此问题。

顺便说一句,我认为这是来自Python课程(见你的问题中的措词),所以我认为你只是学习基础知识。如果没有,或者你想要做得更好,我会选择KevinL并使用CSV module

修改

从新代码(在编辑的问题中):

  1. 您无需检查EOF。循环浏览文件(for s in file)会为您做到这一点。

  2. for s in file已经读了一行。无需再次s = file.readline()

  3. 对于每条分割线,找到等级。将其附加到您在开始时创建(空)的不同列表。此列表包含您的A1等级。

    成绩= [] 对于文件中的s:     columns = s.split(“,”)     grades.append(列[5])

  4. 但是:我认为你需要退一步,仔细写下你的代码正在做什么(或我的代码),或者需要做什么(不是在代码中,在文字中,一步一步)。有很多你缺少,编程明智(甚至不是Python)。

    如果这是家庭作业,也许最好与其他人一起讨论。此外,还有Python tutor mailing list,可能更适合。

    没有冒犯,只是想提供一些实用的建议。