设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
楼主: mty1111
打印 上一主题 下一主题

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

[复制链接]

0

主题

0

好友

22

积分

新手上路

Rank: 1

36#
发表于 2016-7-2 22:46:28 |只看该作者
老师看我这样写的输出是正确的能行吗?
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()
   

回复

使用道具 举报

0

主题

0

好友

22

积分

新手上路

Rank: 1

35#
发表于 2016-7-2 21:47:54 |只看该作者
能够不用results吗(也就是不直接用list),而是直接用result(字符串)保存到文件夹,能的话怎么做 ,不能的话为什么。 求指点
回复

使用道具 举报

0

主题

0

好友

46

积分

新手上路

Rank: 1

34#
发表于 2016-6-30 17:06:11 |只看该作者
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()
复制代码
不过觉得自己写的好麻烦
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

33#
发表于 2016-6-30 15:09:43 |只看该作者
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]]
复制代码
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

46

积分

新手上路

Rank: 1

32#
发表于 2016-6-30 12:54:40 |只看该作者
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分,这是为什么呀。。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

31#
发表于 2016-6-29 16:33:56 |只看该作者
Yumiao_HyunMin 发表于 2016-6-29 15:47
我在for 里面输出results以后,中文名字都是用\x跟着十六进制数来表示:

这样肯定没法比的,你得把分数分离出来,变成数字类型才能比较大小排序,比如把每一项都变成
['xxxx', 200]
['yyy', 201]
这样的格式
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

46

积分

新手上路

Rank: 1

30#
发表于 2016-6-29 15:47:59 |只看该作者
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中文字符吗?还是可以跳过中文名字比较成绩呢
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

排序本身写的没问题,你的results是什么格式的,l[1]表示用每一项的第2个元素来排序
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

46

积分

新手上路

Rank: 1

28#
发表于 2016-6-28 15:12:02 |只看该作者
本帖最后由 Yumiao_HyunMin 于 2016-6-28 15:13 编辑

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

应该写呢?新手求教
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

27#
发表于 2016-1-21 11:21:50 |只看该作者
那夏日 发表于 2016-1-20 11:56
为什么会分别得到4个list,而不是一个包括所有数据list?

因为是每一行拿出来处理的。
整个读进来的数据,其实是一个每一行字符串组成的list
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-6-4 02:25 , Processed in 0.017220 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部