设为首页收藏本站

Crossin的编程教室

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

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

[复制链接]

0

主题

0

好友

46

积分

新手上路

Rank: 1

31#
发表于 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

32#
发表于 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

33#
发表于 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

34#
发表于 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

35#
发表于 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()
复制代码
不过觉得自己写的好麻烦
回复

使用道具 举报

0

主题

0

好友

22

积分

新手上路

Rank: 1

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

使用道具 举报

0

主题

0

好友

22

积分

新手上路

Rank: 1

37#
发表于 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()
   

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

38#
发表于 2016-7-3 14:50:16 |只看该作者
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()
复制代码
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

96

积分

注册会员

Rank: 2

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

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

40#
发表于 2016-12-10 18:57:15 |只看该作者
l0ve1o24 发表于 2016-12-10 16:26
这堂课好难,看了半天
先读取文件成list
再for循环一个个列出来

是。
有点复杂,慢慢理清楚
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-11-22 08:33 , Processed in 0.017130 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部