繁体   English   中英

遍历文件中的行以检查正确的值(Python)

[英]Iterating over lines in a file to check for correct values(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结束,这将只创建一个数字列表。

templist = line.split()[1:] 

会在名称后为您提供所有值。

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

是检查所需内容的好方法。 你不想检查

for num in tempList:

因为这将在第一个值正确的情况下写行(并且在每个后续值都正确的情况下再次写!)

分割行并使用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

该行: 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子句用完之后才击中else子句,而不会击中break语句。

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

if num in range(0,11):

它会创建一个列表[0,1,2,3,4,5,6,7,8,9,10]并且您的给定数字不在此列表中,因此,如果条件永远不会产生True值不会将任何内容写入userOut文件。 因此,将以下行替换为:

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

我修复了您的代码。 这些是我更改的内容:

  • 使用的是codecs.open而不是open (通过utf8使用此库很容易)
  • 使用line.split()[1:]代替line.rsplit(...)
  • 将每个unicode字符串转换为浮点数
  • 检查每个数字是否在if num < 0 or num > 10:的范围内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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM