免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3723 | 回复: 3
打印 上一主题 下一主题

逐个计算文件夹内的文件内数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-27 15:35 |只看该作者 |倒序浏览
python 提出文件夹内所有的 csv文件

csv是按照时间来命名的

2015-10-08.csv
2015-10-09.csv
2015-10-10.csv
2015-10-11.csv
2015-10-12.csv
2015-10-13.csv

如何实现从按照时间排序来读取文件,并且计算文件内的数据

单个文件读取方面 我试了逐行读取:

s = open('C:/Users/yue/000876/2015-10-091.csv','r').readlines()

但是数据是用逗号分割的,
,T,P,C,V,A,T
0,15:00:03,16.82,0.01,0,0,Z
1,14:59:58,16.81,-0.01,30,50429,B
2,14:59:53,16.82,0.01,80,134896,B
3,14:59:43,16.81,--,10,16810,M
4,14:59:43,16.81,-0.01,42,71946,M
5,14:59:38,16.82,--,4,6728,M
6,14:59:33,16.82,0.02,17,28930,B

实际数据是这样排列的csv,每行的单个数据都是用逗号分割的。
我想要计算 每行的倒数第二个数据
0
50429
134896
16810
71946
6728
28930
判断如果这个数据 大于>5000 再判断倒数第一个数据如果为B 则+1 如果是M则 -1 如果是Z 则 +0,计算出所有行的总和。

每个文件按照文件名计算,把所有的计算结果,输出到另外一个TXT上,
输出格式:
时间(csv文件名),每个文件的计算结果总和,每个文件的第一行的(第三个数据)和最后一行的(第三个数据)

求帮忙解决一下这个问题

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-11-27 22:45 |只看该作者
回复 1# yuexiande


    可以参考下这个实现:

#!/usr/bin/env python3

import sys
import os
import csv

def summarize(path):
    is_header = True
    third1, third2 = None, None
    sum = 0
    with open(path) as file:
        csv_reader = csv.reader(file)
        for row in csv_reader:
            if is_header:
                is_header = False
                third1 = row[2]
                continue
            third2 = row[2]
            if int(row[-2]) > 5000:
                if row[-1] == "B":
                    sum += 1
                elif row[-1] == "M":
                    sum -= 1
        print(os.path.basename(path), sum, third1, third2, sep = '  ')

def main():
    """Usage: sum_com dir"""

    dir = sys.argv[1]
    ext = os.path.extsep + 'csv'
    files = sorted([ file for file in os.listdir(dir)
                     if os.path.splitext(file)[1] == ext ])
    for file in files:
        path = os.path.join(dir, file)
        summarize(path)

if __name__ == '__main__':
    main()

论坛徽章:
0
3 [报告]
发表于 2015-12-03 16:41 |只看该作者


回复 1# yuexiande


   我没有给你实现输出到一个文件下,是直接打印出来了:
你需要配置的地方只有一个就是filepath,这个是你csv文件所在的目录。
该脚本会遍历你制定目录下所有层级目录中存在<时间格式>.csv文件,并且将结果打印到屏幕上,如果你需要写入文件,可以自己来实现,剩下的就很简单了。
经过测试符合你的需要

  1. #conding:utf-8
  2. import os
  3. import sys
  4. import string
  5. import re
  6. #print sys.getdefaultencoding()
  7. reload(sys)
  8. sys.setdefaultencoding('utf-8')
  9. #print sys.getdefaultencoding()
  10. myValue1=5000
  11. #filename="D:\\tmp\\tt\\file1.txt"
  12. filepath=r'D:\tmp\tt'
  13. def getSum(filename):
  14.         if not os.path.isfile(filename):
  15.                 print "The file : {} is not exist !!!".format(filename)
  16.                 return 0

  17.         f=open(filename,'r')
  18.         lines=f.readlines()
  19.         f.close()
  20.         total=0
  21.         for line in lines:
  22.                 line=line.strip()
  23.                 s1 = line.split(',')[-2]
  24.                 s2 = line.split(',')[-1]

  25.                 if not s1.isalnum():
  26.                         print "Thers's error on line:{},cannot \
  27.                         trans {} to int".format(line,s1)
  28.                         continue
  29.                 s1=string.atoi(s1)
  30.                 if s1 > myValue1:
  31.                         if s2 == 'B':s1=s1+1
  32.                         elif s2 == 'M':s1=s1-1
  33.                 total=total+s1
  34.         first_value=lines[0].strip().split(',')[2]
  35.         last_value=lines[-1].strip().split(',')[2]
  36.         return [total,first_value,last_value]



  37. #pattern
  38. p1=r'\d{4}-\d{2}-\d{2}\.csv'
  39. pattern=re.compile(p1,re.I)

  40. csvfilelist=[]
  41. for fileinfo in os.walk(filepath):
  42.         for filename in fileinfo[2]:
  43.                 filename_abs=os.path.join(fileinfo[0],filename)
  44.                 if pattern.search(filename_abs):
  45.                         csvfilelist.append(filename_abs)


  46. for csvfile in csvfilelist:
  47.         print "{},{},{},{}".format(csvfile,\
  48.                 getSum(csvfile)[0],getSum(csvfile)[1],getSum(csvfile)[2])
复制代码

评分

参与人数 1信誉积分 +5 收起 理由
yuexiande + 5 很给力!

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2015-12-05 17:35 |只看该作者
本帖最后由 yuexiande 于 2015-12-05 17:36 编辑

回复 3# wencycool

为什么我修改了目录以后运行是这样的

Traceback (most recent call last):
  File "jisuan.py", line 56, in <module>
    getSum(csvfile)[0],getSum(csvfile)[1],getSum(csvfile)[2])
  File "jisuan.py", line 31, in getSum
    s1=string.atoi(s1)
  File "D:\python\lib\string.py", line 403, in atoi
    return _int(s, base)
ValueError: invalid literal for int() with base 10: 'amount'


非常感谢你的回答,因为我刚学python 所以对于代码修改还不是很懂

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP