迭代文件中的行以检查正确的值(Python)

时间:2014-10-22 20:47:18

标签: python

该文件采用以下格式:

Britany     6.06 5.31 4.34 8.60 4.14 3.12 3.53 5.16
Eula        6.46 9.84 7.17 4.89 6.24 8.82 4.31 9.08
Georgianna  0.52 6.95 6.67 5.54 8.27 0.57 8.42 2.76
Emilee      2.66 5.73 3.29 1.27 2.66 9045 1.16 2.81
Serina      3.07 9.22 3.59 0.89 3.91 9.79 6.48 7.81

我需要做的是创建一个功能,检查每个参赛者的每个分数是否在0到10之间。如果参赛者的所有分数都可以接受,则将参赛者和他/她的分数写入干净的数据文件如果没有,参赛者将被淘汰,他/她的数据不会写入干净的数据文件。被淘汰的参赛者的名字和分数应存储在一个列表中。

到目前为止,这是我的代码:

def cleanData(userIn,userOut):
    fileIn = open(userIn,'r',encoding = 'UTF8')
    fileOut = open(userOut,'w',encoding = 'UTF8')
    eliminated=[]
    for line in fileIn:
        tempList= line.rsplit(maxsplit=-9)
        for num in tempList:
            if num in range(0,11):
                userOut.write(line)
            else:
                eliminated.append(line)

我试图做的是读取文件中的行并将其拆分为一个列表,以便我可以迭代这些数字。然后我试图检查每个数字是否符合有效分数的标准,如果所有数字都符合此目标,则将该行写入输出文件。否则我想将该行附加到空列表中以供以后使用。我不确定我是否正确使用maxsplit,但我相信我从-1的最右边的索引开始,并在-8完成,这将创建一个只有数字的列表。

5 个答案:

答案 0 :(得分:1)

templist = line.split()[1:] 

将为您提供名称后面的所有值。

if all([0 <= float(x) <= 10 for x in tempList]):

是检查你想要什么的好方法。你不想检查

for num in tempList:

因为如果第一个值是好的话,那将写入该行(并且在每个后续值都是好的!)

答案 1 :(得分:0)

拆分该行并使用spl[1:]可以访问每个分数,all将检查每个分数是否都在阈值范围内。

with open(in) as f,open(out,"w") as f1:
    eliminated = []
    for line in f:
        spl = line.split() # split line into name and individual scores
        if all(0 <= x <= 10 for x in [float(x) for x in spl[1:]]): # compare spl[1:] which are all the floats/scores
            f1.write(line)  
        else:
            eliminated.append(line)

在一个功能中:

def clean_data(user_in,user_out):
    with open(user_in) as f,open(user_out,"w") as f1:
        eliminated = []
        for line in f:
            spl = line.split()
            if all(0 <= x <= 10 for x in [float(x) for x in spl[1:]]):
                f1.write(line)
            else:
                eliminated.append(line)
    return eliminated

答案 2 :(得分:0)

该行: if num in range(0,11): 仅检查该数字是否为该范围内的整数 我在这个例子中使用了for / else:

for line in fileIn:
    scores = line.split()[1:]
    for score in scores:
        if not 0 < float(score) < 10:
            eliminated.append(line)
            break
    else:
        userOut.write(line)

只有在for子句用尽而没有命中break语句后才会触发else子句。

答案 3 :(得分:0)

问题出现在脚本的下面代码行中:

if num in range(0,11):

它会创建一个列表[0,1,2,3,4,5,6,7,8,9,10]并且你给出的数字不在这个列表中,所以这个if条件永远不会产生一个真值,没有任何内容写入userOut文件。所以用以下代码替换这一行:

if all([0 <= float(x) <= 10 for x in tempList]):

答案 4 :(得分:0)

我修复了你的代码。这些是我改变的事情:

  • 使用codecs.open代替open(使用此库轻松使用utf8)
  • 使用line.split()[1:]代替line.rsplit(...)
  • 将每个unicode字符串转换为浮点数
  • 检查每个号码是否在if num < 0 or num > 10:
  • 的范围内
  • 修正了拼写错误:fileOut.write而不是userOut.write
  • else块从if...else移至for...else

结果如下:

import codecs

def cleanData(userIn,userOut):
    fileIn  = codecs.open(userIn, 'r', encoding='UTF8')
    fileOut = codecs.open(userOut, 'w', encoding='UTF8')
    eliminated = []
    for line in fileIn:
        tempList = line.split()[1:]
        for item in tempList:
            num = float(item)
            if num < 0 or num > 10:
                eliminated.append(line)
                break
        else: # no break
            fileOut.write(line)