设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 62772|回复: 65
打印 上一主题 下一主题

【Python 第33课】 处理文件中的数据

[复制链接]

10

主题

0

好友

52

积分

注册会员

Rank: 2

跳转到指定楼层
#
发表于 2013-7-25 19:33:30 |只看该作者 |正序浏览
本帖最后由 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分钟,轻松学编程

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

results.append 应该放在循环里呀,你想想看呢
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

18

积分

新手上路

Rank: 1

64#
发表于 2018-7-25 11:29:48 |只看该作者
老师,为什么我这个的输出结果只有文本的最后一行?可能是红色框内的有问题

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

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

回复

使用道具 举报

0

主题

0

好友

48

积分

新手上路

Rank: 1

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

明白了!第一次提问真的有被回复很开心!谢谢crossin先生!
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

文件不是代码,不存在注释,那个也会当作内容
这里是我一开始教程里的歧义,后来版本有去掉
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

48

积分

新手上路

Rank: 1

61#
发表于 2018-6-5 09:35:04 |只看该作者
  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'
复制代码
回复

使用道具 举报

0

主题

0

好友

49

积分

新手上路

Rank: 1

60#
发表于 2018-4-28 11:39:40 |只看该作者
cloud 发表于 2018-4-27 21:13
感谢,去掉之后就成功了。但是这是为什么呢?

str将results转换成了字符串类型,写入文件就变成了字符串
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

59#
发表于 2018-4-27 21:13:50 |只看该作者
小小艳紫 发表于 2018-4-27 14:44
39行 results为什么要加str?把str去掉试试

感谢,去掉之后就成功了。但是这是为什么呢?
回复

使用道具 举报

0

主题

0

好友

49

积分

新手上路

Rank: 1

58#
发表于 2018-4-27 14:44:25 |只看该作者
cloud 发表于 2018-4-27 12:52
小白一枚,请问这个运行后txt文件里的内容为什么不能换行?

39行 results为什么要加str?把str去掉试试
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

57#
发表于 2018-4-27 12:52:18 |只看该作者
小白一枚,请问这个运行后txt文件里的内容为什么不能换行?

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

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

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

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

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

打开写入文件的时候也加上 encoding
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 20:24 , Processed in 0.019996 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部