Crossin的编程教室

标题: 【Python 第33课】 处理文件中的数据 [打印本页]

作者: mty1111    时间: 2013-7-25 19:33
标题: 【Python 第33课】 处理文件中的数据
本帖最后由 mty1111 于 2013-7-25 19:34 编辑

我们已经知道了如何读取和写入文件。有了这两个操作文件的方法,再加上对文件内容的处理,就能写一些小程序,解决不少日常的数据处理工作。

比如我现在拿到一份文档,里面有某个班级里所有学生的平时作业成绩。因为每个人交作业的次数不一样,所以成绩的数目也不同,没交作业的时候就没有分。我现在需要统计每个学生的平时作业总得分。

记得我小的时候,经常有同学被老师喊去做统计分数这种“苦力”。现在电脑普及了,再这么干就太弱了。用python,几行代码就可以搞定。

看一下我们的文档里的数据:
  1. #-- scores.txt
  2. 刘备 23 35 44 47 51
  3. 关羽 60 77 68
  4. 张飞 97 99 89 91
  5. 诸葛亮 100
复制代码
1.先把文件读进来:
  1. f = file('scores.txt')
复制代码
2.取得文件中的数据。因为每一行都是一条学生成绩的记录,所以用readlines,把每一行分开,便于之后的数据处理:
  1. lines = f.readlines()
  2. f.close()
复制代码
提示:在程序中,经常使用print来查看数据的中间状态,可以便于你理解程序的运行。比如这里你可以print lines,看一下内容被存成了什么格式。

3.对每一条数据进行处理。按照空格,把姓名、每次的成绩分割开:
  1. for line in lines:
  2.    data = line.split()
复制代码
接下来的4、5两个步骤都是针对一条数据的处理,所以都是在for循环的内部。

4.整个程序最核心的部分到了。如何把一个学生的几次成绩合并,并保存起来呢?我的做法是:对于每一条数据,都新建一个字符串,把学生的名字和算好的总成绩保存进去。最后再把这些字符串一起保存到文件中:
  1. sum = 0
  2. for score in data[1:]:
  3.    sum += int(score)
  4. result = '%s\t: %d\n' % (data[0], sum)
复制代码
这里几个要注意的点:
对于每一行分割的数据,data[0]是姓名,data[1:]是所有成绩组成的列表。
每次循环中,sum都要先清零。
score是一个字符串,为了做计算,需要转成整数值int。
result中,我加了一个制表符\t和换行符\n,让输出的结果更好看些。

5.得到一个学生的总成绩后,把它添加到一个list中。
  1. results.append(result)
复制代码
results需要在循环之前初始化results = []

6.最后,全部成绩处理完毕后,把results中的内容保存至文件。因为results是一个字符串组成的list,这里我们直接用writelines方法:
  1. output = file('result.txt', 'w')
  2. output.writelines(results)
  3. outpus.close()
复制代码
大功告成,打开文件检验一下结果吧。

以下是完整程序,把其中print前面的注释符号去掉,可以查看关键步骤的数据状态。不过因为字符编码的问题,list的中文可能会显示为你看不懂的字符。
  1. f = file('scores.txt')
  2. lines = f.readlines()
  3. #print lines
  4. f.close()

  5. results = []

  6. for line in lines:
  7.    #print line
  8.    data = line.split()
  9.    #print data
  10.   
  11.    sum = 0
  12.    for score in data[1:]:
  13.        sum += int(score)
  14.    result = '%s \t: %d\n' % (data[0], sum)
  15.    #print result

  16.    results.append(result)

  17. #print results
  18. output = file('result.txt', 'w')
  19. output.writelines(results)
  20. output.close()
复制代码
0.jpg

#==== Crossin的编程教室 ====#
微信ID:crossincode
QQ群:312723402

面向零基础初学者的编程课
每天5分钟,轻松学编程


作者: 福尔摩斯683    时间: 2014-2-6 23:59
data[1:]
这个是下标为1以后的数组元素吗?
作者: crossin先生    时间: 2014-2-7 11:55
福尔摩斯683 发表于 2014-2-6 23:59
data[1:]
这个是下标为1以后的数组元素吗?

是的,从1开始,包括1
如果是数字在冒号后面,则是到那个数字前,不包括它
作者: Go_for_Math    时间: 2014-5-31 10:33
本帖最后由 Go_for_Math 于 2014-5-31 11:18 编辑

Traceback (most recent call last):
  File "E:/Python27/lesson/lesson33.py", line 10, in <module>
    result='%s\t%d\n'%(data[0],sum)
IndexError: list index out of range


我一运行就出现这样的提示,没法继续,这个原因“list index out of range”具体是啥呢?

(⊙o⊙)…找到原因了,因为我保存的score.txt文件里多加了2个回车,导致多了1行为空,就会报错(如果只是一个回车就行的样子)
作者: crossin先生    时间: 2014-5-31 16:00
Go_for_Math 发表于 2014-5-31 10:33
Traceback (most recent call last):
  File "E:/Python27/lesson/lesson33.py", line 10, in
    result= ...

空行导致第一个data是空list,访问data[0],0这个index就out了data这个list的range
作者: Eagle    时间: 2014-6-7 09:23
我将字符输出打印,出现这个
['EncFile\x00\x01\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00notepad.exe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x1b\x00\x00J\xf4\xa2\t\xda\xa3 7\xa6\xb1G\xdc\xaa\x96\x9c\x9dk\x80\xa0\x08\xd1s']   
作者: crossin先生    时间: 2014-6-8 14:21
Eagle 发表于 2014-6-7 09:23
我将字符输出打印,出现这个
['EncFile\x00\x01\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 ...

你这是把一个list对象整个打印了,所以程序不会解码。你要把list里面的元素拿出来打印
作者: QQ_E29166    时间: 2014-7-26 20:13
f = file('E:/scores.txt')
output = file('E:/result.txt', 'w')
我把他们写成
f = file('E:\scores.txt')
output = file('E:\result.txt', 'w')
就是报错!!原来  \和/不一样。
作者: crossin先生    时间: 2014-7-27 16:49
QQ_E29166 发表于 2014-7-26 20:13
f = file('E:/scores.txt')
output = file('E:/result.txt', 'w')
我把他们写成

\是转义字符,会把很多字符变成特殊含义的,要用也是\\
作者: zzxomg    时间: 2015-3-14 16:25
#coding:utf-8
#读取文件计算学生总成绩
#read file
results = []
f = file('scoreDate.txt')
scores = f.readlines()
for line in scores :
                data = line.split(' ')
                count = 0
                for core in data[1:] :
                                count += int(core)
                result = data[0] + '' + str(count) + '\n'
                results.append(result)
f2 = file('countScores.txt','w')
f2.writelines(results)
print '总成绩已经计算完毕啦!!快去查看吧!'
f2.close()

作者: cross    时间: 2015-4-24 14:45
  1. f = file('scores.txt')
  2. lines = f.readlines()
  3. f.close()

  4. results = []

  5. for line in lines:
  6.     #print line
  7.     data = line.split()
  8.     #print data

  9.     sum = 0
  10.     for score in data[1:]:
  11.         sum +=int(score)
  12.     result = '%s \t:%d\n' % (data[0],sum)
  13.     #print result

  14.     results.append(result)
  15. for i in results:
  16.     print i
  17.     output = file('result.txt','w')
  18.     output.writelines(results)
  19.     output.close
复制代码
为什么我的第一遍F5后只有一个空白的txt,多运行几遍才出来结果
作者: crossin先生    时间: 2015-4-24 15:30
你最后一段有问题
每次都在循环里 writelines
也没有调用 close()
作者: 460883323    时间: 2015-12-9 16:27
捕获.JPG
这为啥突然报了转型错误。。。。
作者: 460883323    时间: 2015-12-9 16:38
460883323 发表于 2015-12-9 16:27
这为啥突然报了转型错误。。。。

好吧,这个问题我把score。txt里面的一些字段删掉就没了,又变成这个错误:
捕获.JPG
作者: 460883323    时间: 2015-12-9 20:42
460883323 发表于 2015-12-9 16:38
好吧,这个问题我把score。txt里面的一些字段删掉就没了,又变成这个错误:
...

假如把报错这行放到sum的循环里面的话,就会不报错,但是生成的文件不对
捕获.JPG
作者: crossin先生    时间: 2015-12-9 21:23
460883323 发表于 2015-12-9 20:42
假如把报错这行放到sum的循环里面的话,就会不报错,但是生成的文件不对
...

调试的时候,把每一步的结果print出来,看看是什么情况,哪里和预想的值不一样了

作者: 460883323    时间: 2015-12-9 22:40
crossin先生 发表于 2015-12-9 21:23
调试的时候,把每一步的结果print出来,看看是什么情况,哪里和预想的值不一样了
...

恕我愚钝,不是很明白先生的意思。如果在 for score 这个循环里面添加print result的话,那么输出是一个累加过程,如果直接复制先生的代码运行的话,不知道为啥也会有报错,唯有这样改动下不报错,却出现一个名字重复出现两次的情况
作者: crossin先生    时间: 2015-12-10 21:34
460883323 发表于 2015-12-9 22:40
恕我愚钝,不是很明白先生的意思。如果在 for score 这个循环里面添加print result的话,那么输出是一个 ...


data[0]那里报out of range,说明data有问题,你把每次的data都打印出来看是什么情况
应该是因为有空行,造成最后一个data是空的,空的data去取data[0]自然就有问题了

作者: catherinemic    时间: 2016-1-3 15:41
crossin 老师,我想把txt文件保存在一个单独的文件夹里,于是去查了查相对路径怎么写,试着改了下,第一个地方通过了,为什么第二个地方总是有问题呢?
  1. f=file('.\data file\grades.txt')
  2. lines=f.readlines()
  3. print lines
  4. f.close

  5. results=[]

  6. for line in lines:
  7.     print line
  8.     data=line.split()
  9.     print data

  10.     sum=0
  11.     for score in data[1:]:
  12.         sum+=int(score)
  13.     result='%s\t:%d\n'%(data[0],sum)
  14.     print result
  15.    
  16.     results.append(result)

  17. print results
  18.    
  19. output=file('.\data file\result.txt','w')
  20. output.writelines(results)
  21. output.close
复制代码
后来我把创建第二个txt文件那里改成’result.txt',运行没有问题,但是创建的txt文件打开确实空的,不知道怎么回事,昨天“写文件”那课是正常的。今天又试了单独write,也不行。

Python17.png (15.7 KB, 下载次数: 354)

Python17.png


作者: catherinemic    时间: 2016-1-3 15:48
catherinemic 发表于 2016-1-3 15:41
crossin 老师,我想把txt文件保存在一个单独的文件夹里,于是去查了查相对路径怎么写,试着改了下,第一个 ...

刚才发现单独write那个写进去了,writelines这个仍然不行。
作者: catherinemic    时间: 2016-1-3 15:53
catherinemic 发表于 2016-1-3 15:41
crossin 老师,我想把txt文件保存在一个单独的文件夹里,于是去查了查相对路径怎么写,试着改了下,第一个 ...

刚才试着把内容写进一个新的txt文件,然后去看,发现原来的突然都有内容了,新的却还是没有。
作者: crossin先生    时间: 2016-1-3 16:50
catherinemic 发表于 2016-1-3 15:53
刚才试着把内容写进一个新的txt文件,然后去看,发现原来的突然都有内容了,新的却还是没有。 ...

你那个地址里有\符号,会转义的,要么用r'xxxxxx',要么用双\\。
另外你close没有加括号,并没有调用函数
作者: catherinemic    时间: 2016-1-3 16:59
crossin先生 发表于 2016-1-3 16:50
你那个地址里有\符号,会转义的,要么用r'xxxxxx',要么用双\\。
另外你close没有加括号,并没有调用函数 ...

试了\\,这次没问题了,r'xxxxxx'是什么呢?
作者: crossin先生    时间: 2016-1-4 14:51
catherinemic 发表于 2016-1-3 16:59
试了\\,这次没问题了,r'xxxxxx'是什么呢?

字符串前面加r就是不转义,保留原始字符
作者: catherinemic    时间: 2016-1-7 21:14
crossin先生 发表于 2016-1-4 14:51
字符串前面加r就是不转义,保留原始字符

明白啦,谢谢crossin先生!
作者: 那夏日    时间: 2016-1-20 11:56
为什么会分别得到4个list,而不是一个包括所有数据list?
作者: crossin先生    时间: 2016-1-21 11:21
那夏日 发表于 2016-1-20 11:56
为什么会分别得到4个list,而不是一个包括所有数据list?

因为是每一行拿出来处理的。
整个读进来的数据,其实是一个每一行字符串组成的list
作者: Yumiao_HyunMin    时间: 2016-6-28 15:12
本帖最后由 Yumiao_HyunMin 于 2016-6-28 15:13 编辑

想问个问题,如果想让输出的总成绩按照每个人总分降序排列要怎么写?我在results.append(result)后面用了lambda但不太会用,排列出来并不是降序或者是升序的:
results.sort(key=lambda l: (l[1]), reverse = True)

应该写呢?新手求教

作者: crossin先生    时间: 2016-6-29 14:24
Yumiao_HyunMin 发表于 2016-6-28 15:12
想问个问题,如果想让输出的总成绩按照每个人总分降序排列要怎么写?我在results.append(result)后面用了la ...

排序本身写的没问题,你的results是什么格式的,l[1]表示用每一项的第2个元素来排序
作者: Yumiao_HyunMin    时间: 2016-6-29 15:47
crossin先生 发表于 2016-6-29 14:24
排序本身写的没问题,你的results是什么格式的,l[1]表示用每一项的第2个元素来排序 ...

我在for 里面输出results以后,中文名字都是用\x跟着十六进制数来表示:
  1. ['\xe5\x88\x98\xe5\xa4\x87 \t: 200\n']
  2. ['\xe5\x88\x98\xe5\xa4\x87 \t: 200\n', '\xe5\x85\xb3\xe7\xbe\xbd \t: 205\n']
  3. ['\xe5\x88\x98\xe5\xa4\x87 \t: 200\n', '\xe5\x85\xb3\xe7\xbe\xbd \t: 205\n', '\xe5\xbc\xa0\xe9\xa3\x9e \t: 376\n']
  4. ['\xe5\xbc\xa0\xe9\xa3\x9e \t: 376\n', '\xe5\x88\x98\xe5\xa4\x87 \t: 200\n', '\xe5\x85\xb3\xe7\xbe\xbd \t: 205\n', '\xe8\xaf\xb8\xe8\x91\x9b\xe4\xba\xae \t: 100\n']

  5. 需要先decode中文字符吗?还是可以跳过中文名字比较成绩呢
复制代码

作者: crossin先生    时间: 2016-6-29 16:33
Yumiao_HyunMin 发表于 2016-6-29 15:47
我在for 里面输出results以后,中文名字都是用\x跟着十六进制数来表示:

这样肯定没法比的,你得把分数分离出来,变成数字类型才能比较大小排序,比如把每一项都变成
['xxxx', 200]
['yyy', 201]
这样的格式
作者: Yumiao_HyunMin    时间: 2016-6-30 12:54
crossin先生 发表于 2016-6-29 16:33
这样肯定没法比的,你得把分数分离出来,变成数字类型才能比较大小排序,比如把每一项都变成
['xxxx', 20 ...

先生您好!我改了下代码把四个人的成绩变成了四个list:
  1. # -*- coding: utf-8 -*-
  2. import re
  3. f = file('score.txt')
  4. lines = f.readlines()
  5. #print lines
  6. f.close()

  7. results = []

  8. for line in lines:
  9.     #print line
  10.     data = line.split()
  11.     #print data

  12.     sum = 0
  13.     for score in data[1:]:
  14.         sum += int(score)
  15.         result = '%s \t: %d\n' % (data[0], sum)
  16.         #print result
  17.     score = re.findall(r"\d+\.?\d*", result)

  18.     for s in score:
  19.         s = str(s)
  20.         results = []
  21.         results.append('%s \t:' % data[0])
  22.         results.append(s)
  23.         results.sort(key=lambda l: (l[1]), reverse = True)
  24.         #print results
  25.         output = file('result.txt', 'w')
  26.         print results
  27.         output.writelines(results)
  28.         output.close()
复制代码
最后输出results可以看到是这样的:
  1. ['\xe5\xbc\xa0\xe9\xa3\x9e \t:', '200']
  2. ['\xe5\x88\x98\xe5\xa4\x87 \t:', '205']
  3. ['\xe5\x85\xb3\xe7\xbe\xbd \t:', '376']
  4. ['\xe6\x9b\xb9\xe6\x93\x8d \t:', '100']
复制代码
但是排序还是没起到作用,并且在result.txt里只输出了最后一个人的100分,这是为什么呀。。
作者: crossin先生    时间: 2016-6-30 15:09
Yumiao_HyunMin 发表于 2016-6-30 12:54
先生您好!我改了下代码把四个人的成绩变成了四个list:最后输出results可以看到是这样的:但是排序还是 ...

你的results应该是包含所有结果的整个list,而不是分4次做。你现在是循环了4次,每次拿其中一个,然后完了写到文件里。所以执行完就剩最后一条记录。
另外,分数你要用数字类型,才能排序。
所以你的 results 应该是类似这样的数据:
  1. [['\xe5\xbc\xa0\xe9\xa3\x9e \t:', 200], ['\xe5\x88\x98\xe5\xa4\x87 \t:', 205], ['\xe5\x85\xb3\xe7\xbe\xbd \t:', 376], ['\xe6\x9b\xb9\xe6\x93\x8d \t:', 100]]
复制代码

作者: Yumiao_HyunMin    时间: 2016-6-30 17:06
crossin先生 发表于 2016-6-30 15:09
你的results应该是包含所有结果的整个list,而不是分4次做。你现在是循环了4次,每次拿其中一个,然后完 ...

谢谢先生!已经成功啦
  1. # -*- coding: utf-8 -*-
  2. import re
  3. f = file('score.txt')
  4. lines = f.readlines()
  5. #print lines
  6. f.close()

  7. list = []

  8. for line in lines:
  9.     #print line
  10.     data = line.split()
  11.     #print data

  12.     sum = 0
  13.     for score in data[1:]:
  14.         sum += int(score)
  15.         result = '%s \t: %d\n' % (data[0], sum)
  16.        # print result
  17.     score = re.findall(r"\d+\.?\d*", result)

  18.     for s in score:
  19.         s = int(s)
  20.         results = []
  21.         results.append('%s \t:' % data[0])
  22.         results.append(s)
  23.         #results.sort(key=lambda l: (l[1]), reverse = True)
  24.         #print results
  25.         i=0
  26.         list.insert(i, results)
  27.         i+=1
  28.         list.sort(key=lambda l: (l[1]), reverse = True)
  29.         #print list
  30.     output = file('result.txt', 'w')
  31.     for i in list:
  32.         k=' '.join([str(j) for j in i])
  33.         output.write(k+"\n")
  34.     output.close()
复制代码
不过觉得自己写的好麻烦
作者: liqingyunfeng    时间: 2016-7-2 21:47
能够不用results吗(也就是不直接用list),而是直接用result(字符串)保存到文件夹,能的话怎么做 ,不能的话为什么。 求指点
作者: liqingyunfeng    时间: 2016-7-2 22:46
老师看我这样写的输出是正确的能行吗?
f= file('score.txt')
lines=f.readlines()
f.close()
print lines
for line in lines:
    data=line.split()
    sum = 0
    for score in data[1:]:
        sum += int(score)
    result = '%s\t:%d\n'%(data[0],sum)
    output = file('www.txt','a')
    output.write(result)
    output.close()
   


作者: crossin先生    时间: 2016-7-3 14:50
liqingyunfeng 发表于 2016-7-2 22:46
老师看我这样写的输出是正确的能行吗?
f= file('score.txt')
lines=f.readlines()
  1. result = ''
  2. for line in lines:
  3.     data=line.split()
  4.     sum = 0
  5.     for score in data[1:]:
  6.         sum += int(score)
  7.     result += '%s\t:%d\n'%(data[0],sum)
  8. output = file('www.txt','a')
  9. output.write(result)
  10. output.close()
复制代码

作者: l0ve1o24    时间: 2016-12-10 16:26
这堂课好难,看了半天
先读取文件成list
再for循环一个个列出来
再代替空格做成list
再用for循环在list里面把分数相加
再把得到的名字和分数做成一个list
最后整个list写到新文件里
是这样吗?老师
作者: crossin先生    时间: 2016-12-10 18:57
l0ve1o24 发表于 2016-12-10 16:26
这堂课好难,看了半天
先读取文件成list
再for循环一个个列出来

是。
有点复杂,慢慢理清楚
作者: 枫叶落时    时间: 2017-8-11 00:26
先生,我对自增的用法很疑惑,以及上面用的自增也很不解,自增等于列表中的元素相加吗?
作者: woodumpling    时间: 2017-8-14 08:58
枫叶落时 发表于 2017-8-11 00:26
先生,我对自增的用法很疑惑,以及上面用的自增也很不解,自增等于列表中的元素相加吗? ...

你所指的自增用法是指
a += b这样的用法吗?
这个语句的作用是讲b的值加到a现有的值上并赋值给a,等价于
a = a + b
作者: 枫叶落时    时间: 2017-8-14 14:14
谢谢你,明白了~
作者: python小小白    时间: 2017-9-21 16:03
你好,请问results = []代表什么呢?
作者: crossin先生    时间: 2017-9-21 23:40
python小小白 发表于 2017-9-21 16:03
你好,请问results = []代表什么呢?

results 赋值为一个空列表
作者: Matthewguo    时间: 2017-9-28 16:31
花了一晚上时间终于想清楚了。
  1. score=open('scores.txt')
  2. data1=score.readlines() #把所有内容转换为list

  3. results=[]

  4. for i in data1:
  5.     a=i.split()

  6.     sum=0
  7.     for score in a[1:]:
  8.         sum+=int(score)
  9.     result='%s : %d'%(a[0],sum)

  10.     results.append(result) #将result结果添加到之前建立好的results的list中

  11. final=open('new.txt','w')
  12. final.writelines(results)
  13. final.close()
复制代码
但是输出结果有些问题,变成了一行
a : 10b : 6c : 3

作者: crossin先生    时间: 2017-9-28 17:29
Matthewguo 发表于 2017-9-28 16:31
花了一晚上时间终于想清楚了。但是输出结果有些问题,变成了一行
a : 10b : 6c : 3
...

writelines不负责帮你加换行,所以要手动给每行加上 \n
作者: LnnQi    时间: 2017-10-16 13:37
本帖最后由 LnnQi 于 2017-10-16 13:44 编辑
  1. f = open('score.txt')
  2. lines = f.readlines()
  3. print(lines)
  4. f.close()

  5. results = []

  6. for line in lines:
  7.     print(line)
  8.     data = line.split()
  9.     print(data)
  10.     sum = 0
  11.     for score in data[1:]:
  12.         sum += int(score)
  13.     result = '%s \t:%d\n' %(data[0],sum)
  14.     print(result)
  15.     results.append(result)

  16. print(results)
  17. output = open('result.txt','w')
  18. output.writelines(result)
  19. output.close()
复制代码
检查了几遍感觉应该没错,但是result.txt里只有一行诸葛亮,主公们被吃掉了……
倒数第二行把list写错了,把汇总输出的results写成了临时存数据的result……



作者: yamika    时间: 2018-3-10 16:50
f=open('score.txt')       #打开分数的文件,保存于f中
lines=f.readlines()       #按行读取数据,保存于lines,为list
f.close()                 #关闭文件
for line in lines:        
    data=line.split()     #每一行按空格分离,每一行又是一个list
    summ=0
    for score in data[1:]:             #第二个元素(也就是分数)开始求和
        summ=summ+int(score)
        result='%s:%d'%(data[0],summ)
       results=[]
        results.append(result)
    print(results)
output=open('jieguo.txt','w')
r=str(results)
output.write(r)

运行后能把成绩总分输出,但最后3行好像有问题,创建了jieguo.txt文件,但里面是空白,没法写入结果,请问这是怎么回事?
(另外:我用的py3)

作者: crossin先生    时间: 2018-3-11 15:42
yamika 发表于 2018-3-10 16:50
f=open('score.txt')       #打开分数的文件,保存于f中
lines=f.readlines()       #按行读取数据,保存于 ...

你没有close()
作者: yamika    时间: 2018-3-11 19:21
crossin先生 发表于 2018-3-11 15:42
你没有close()

解决了!原来不关文件影响这样严重。感谢指导!
作者: kakason    时间: 2018-3-17 00:45
crossin先生 发表于 2018-3-11 15:42
你没有close()

先生,不明白文中所说的每次循环前sum 都要清0,sum不是用来赋值0后来循环一个一个相加的吗?
作者: crossin先生    时间: 2018-3-17 15:10
kakason 发表于 2018-3-17 00:45
先生,不明白文中所说的每次循环前sum 都要清0,sum不是用来赋值0后来循环一个一个相加的吗? ...

清0是在循环之前啊,每个人的总分不要先清零再算吗
作者: 司南    时间: 2018-4-10 18:43
  1. f=open('score.txt')
  2. data=f.readlines()
  3. print(data)
  4. f.close

  5. results=[]
  6. for line in data:
  7.     data1=line.split()
  8.     print(data1)
  9.     sum=0  #sum在此处进行清零,保证data中的每个人都从零开始算总分
  10.     for score in data1[1:]:
  11.         sum+=int(score)
  12.     result='%s\t%d\n' %(data1[0],sum)
  13.     print(result)
  14.     results.append(result)
  15. output=open('result.txt','w')
  16. output.writelines(results)
  17. output.close()
复制代码

作者: jzhan030    时间: 2018-4-16 15:53
本帖最后由 jzhan030 于 2018-4-16 16:25 编辑

Traceback (most recent call last):
  File "C:/Users/win10/PycharmProjects/python3/read the data.py", line 3, in <module>
    lines = f.readlines()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 4: illegal multibyte sequence
先生您好,我的出现了这个问题?是因为scores.txt里面含有中文吗?
编码如下:
f = open('scores.txt')
lines = f.readlines()
print(lines)
f.close()

results=[]

for line in lines:
    print(line)
    data = line.split()
    print(data)

    sum = 0
    for score in data[1:]:
        sum += int(score)
    result = '%s\t:%d\n'%(data[0],sum)
    print(result)

    results.append(result)

print(results)
output = open('result.txt','w')
output.writelines(results)
output.close()

作者: crossin先生    时间: 2018-4-16 23:09
jzhan030 发表于 2018-4-16 15:53
Traceback (most recent call last):
  File "C:/Users/win10/PycharmProjects/python3/read the data.py", ...

应该是的
有中文,而且不是gbk编码
作者: jzhan030    时间: 2018-4-17 09:58
crossin先生 发表于 2018-4-16 23:09
应该是的
有中文,而且不是gbk编码

谢谢回复。我稍改了一下。可以识别中文了。但是输出的result.txt里面中文部分还是乱码。请问这个怎么解决。有没有让python3 识别输出中文的解决方法。谢谢!

f = open('scores.txt',encoding='utf8')
#加了encoding=utf8之后可以识别中文了

作者: crossin先生    时间: 2018-4-18 00:03
jzhan030 发表于 2018-4-17 09:58
谢谢回复。我稍改了一下。可以识别中文了。但是输出的result.txt里面中文部分还是乱码。请问这个怎么解决 ...

打开写入文件的时候也加上 encoding
作者: cloud    时间: 2018-4-27 12:52
小白一枚,请问这个运行后txt文件里的内容为什么不能换行?

N{CF%$(COC{Q@)4G%BZNJKM.png (93.84 KB, 下载次数: 394)

N{CF%$(COC{Q@)4G%BZNJKM.png

34ENM}`KJBA3`_2][[QF~K7.png (65.52 KB, 下载次数: 389)

34ENM}`KJBA3`_2][[QF~K7.png


作者: 小小艳紫    时间: 2018-4-27 14:44
cloud 发表于 2018-4-27 12:52
小白一枚,请问这个运行后txt文件里的内容为什么不能换行?

39行 results为什么要加str?把str去掉试试
作者: cloud    时间: 2018-4-27 21:13
小小艳紫 发表于 2018-4-27 14:44
39行 results为什么要加str?把str去掉试试

感谢,去掉之后就成功了。但是这是为什么呢?
作者: 小小艳紫    时间: 2018-4-28 11:39
cloud 发表于 2018-4-27 21:13
感谢,去掉之后就成功了。但是这是为什么呢?

str将results转换成了字符串类型,写入文件就变成了字符串
作者: suiersoda    时间: 2018-6-5 09:35
  1. f = open('score.txt')
  2. lines = f.readlines()
  3. print(lines)
  4. f.close()

  5. results=[]

  6. for line in lines:
  7.     print(line)
  8.     data = line.split()
  9.     print(data)
  10.    
  11.     sum = 0#每次循环时,sum都需要清零
  12.     for score in data[1:]:
  13.         sum += int(score)
  14.         

  15.     result = '%s\t:%d\n'%(data[0],sum)
  16.     print(result)

  17.     results.append(result)

  18. print(results)
  19. output = open('result.txt','w')
  20. output.writelines(results)
  21. output.close()
复制代码
当文件中有#-- scores.txt时,int(score)就会报错,因为解析出来的第一行是这个注释,无法转成int形,去掉就可以,那么就是说我们这个score的文件中不能用注释了是么?
  1. Traceback (most recent call last):
  2.   File "F:\Selenium 2自动化测试实战  基于Python语言\练习脚本\lesson33--处理文件中的数据.py", line 15, in <module>
  3.     sum += int(score)
  4. ValueError: invalid literal for int() with base 10: 'scores.txt'
复制代码

作者: crossin先生    时间: 2018-6-5 11:15
suiersoda 发表于 2018-6-5 09:35
当文件中有#-- scores.txt时,int(score)就会报错,因为解析出来的第一行是这个注释,无法转成int形,去 ...

文件不是代码,不存在注释,那个也会当作内容
这里是我一开始教程里的歧义,后来版本有去掉
作者: suiersoda    时间: 2018-6-5 11:30
crossin先生 发表于 2018-6-5 11:15
文件不是代码,不存在注释,那个也会当作内容
这里是我一开始教程里的歧义,后来版本有去掉 ...

明白了!第一次提问真的有被回复很开心!谢谢crossin先生!
作者: shan91    时间: 2018-7-25 11:29
老师,为什么我这个的输出结果只有文本的最后一行?可能是红色框内的有问题

{DA9C7567-9F81-4F00-B03C-27C478F80BCE}.jpg (26.03 KB, 下载次数: 450)

{DA9C7567-9F81-4F00-B03C-27C478F80BCE}.jpg


作者: crossin先生    时间: 2018-7-25 15:20
shan91 发表于 2018-7-25 11:29
老师,为什么我这个的输出结果只有文本的最后一行?可能是红色框内的有问题
...

results.append 应该放在循环里呀,你想想看呢




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5