该文件采用以下格式:
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完成,这将创建一个只有数字的列表。
答案 0 :(得分:1)
这可能是一种更优雅的方式。这将逐行迭代,用白色空格分割行,然后计算名称后面的浮点数,其中0 <= x&lt; = 10:
outfile = open('outfile.txt', 'w')
for line in open('scores.txt', 'r').readlines():
if len([score for score in line.strip().split()[1:] if (float(score) >= 0 and float(score) <= 10)]) == 8:
outfile.write(line.strip() + '\n')
outfile.close()
预计会看到8个花车。它不会处理名称中的空格,如果遇到无法转换为浮点数的内容,则会抛出错误。
答案 1 :(得分:0)
with open(file) as f:
for line in f:
process_line(line)
答案 2 :(得分:0)
由于这是一项任务,我将为您提供一些提示:
请记住,您正在阅读的数据是字符串,而不是数字。因此,在进行任何数学运算之前,请确保正确转换它们。
使用.split()
将每一行转换为一个列表。
使用with statement
打开文件并对其进行迭代,您可以同时使用它进行读写:
with open('somefile.txt', 'r') as inf, open('otherfile.txt', 'w') as outf:
for line in inf:
# do something with the line
if line matches some condition:
outf.write(line) # write the same line out
答案 3 :(得分:0)
这是一个函数式编程解决方案:
def is_int_less_than_10(x):
result = False
try:
result = float(x)<10
except ValueError:
pass
return result
with open('in.txt', 'r') as f_in, open('out.txt', 'w') as f_out:
for line in f_in:
values = [x.strip() for x in line.split(" ")[1:] if x.strip()] #skip country and clean the values
if all(map(is_int_less_than_10, values):
f_out.write(line)