使用Python将列添加到csv文件中,基于来自多个文件的数据?

时间:2016-10-19 21:43:16

标签: python

我获取原始数据然后重新排序列,根据来自多个文件的数据添加数据,添加一些硬编码数据,然后保存到" output.csv"文件。

例如......

File1.csv :(检索数据)
人,日期时间,网站,状态

Person1,01/13/16 10:38,SiteA,I
Person1,01/20/16 12:53,SiteC,O
Person2,01/21/16 14:45,SiteB,O
Person3,01/17/16 12:17,SiteA,I
Person3,01/25/16 10:15,SiteB,L

File2.csv :(固定Data_1)
站点,代码

SiteA,101
SiteB,102
SiteC,103

File3.csv :(固定数据_2)
period_start_time,period_end_time,周期

00:00,07:59,0
08:00,09:00,1
09:01,10:00,2
10:01,11:00,3
11:01,12:00,4
12:01,13:00,5
13:01,14:00,6
14:01,15:00,7
15:01,23:59,X

File1有原始数据 最后一栏有一个" I"," O"和" L"。
"我"代表IN。
" O"代表OUT。
" L"代表晚。

此示例有三名学生进出A,B或C站点 注意,如果他们是" L"或者他们还在继续。

File2有"网站代码"。

File3的第一列说明了period_start_time,第二列是period_end_time。
第三列是期间。

我需要创建一个output.csv文件:
WHERE,其中,PERIOD,DATE TIME_IN,TIME_OUT,USERNAME

WHERE =需要是来自File2的相应站点代码 WHOM =是这个人 PERIOD =如果时间是10:38,那么时间是" 3",由File3给出。
DATE =显示时间为' mm / dd / yy' TIME_IN =显示时间为' HH:MM'如果状态是"我"或者" L",如果没有,则留空。
TIME_OUT =显示时间为' HH:MM'如果状态为" O",如果没有,则留空。
USERNAME =是硬编码的"用户名"。

如上面的示例数据,output.csv文件应该如下所示
output.csv :(重新格式化数据)

101,Person1,3,01/13/16,10:38,,Username
103,Person1,5,01/20/16,,12:53,Username
102,Person2,7,01/21/16,,14:45,Username
101,Person3,5,01/17/16,12:17,,Username
102,Person3,3,01/25/16,10:15,,Username

请注意第一栏中的相应代码 另请注意PERIOD以及TIME_IN和TIME_OUT列的空白。

终于明白了。

from datetime import datetime as dt
import csv

class TimePeriod:
    def __init__(self, starttime, endtime, periodname):
        self.starttime = starttime
        self.endtime = endtime
        self.periodname = periodname

def get_time_list(time_file):
    timelist = list()
    with open(time_file) as inputs:
        for line in inputs:
            starttime, endtime, periodname = line.strip().split(",")
            timelist.append(TimePeriod(starttime, endtime, periodname))                
    return timelist

def get_site_code_dict(site_code_file):
    mydict = dict()
    with open(site_code_file) as inputs:
        for line in inputs:
            site,code = line.strip().split(",")
            mydict[site] = code
    return mydict

def process_raw(raw_file, site_code_dict):
    with open(raw_file) as inputs, open('ouput.csv', 'w') as outlist:
        for line in inputs:
            person, date_time, site, status = line.strip().split(",")
            time_object = dt.strptime(date_time, '%m/%d/%y %H:%M')
            date = time_object.strftime('%m/%d/%y')
            time = time_object.strftime('%H:%M')
            filteredlist = filter(lambda x: time >= x.starttime and time <= x.endtime, time_list)
            outlist.write(site_code_dict[site]+',')
            outlist.write(person+',')
            outlist.write(date+',')
            outlist.write(filteredlist[0].periodname+',')
            if status == "I" or status == "L":
                outlist.write(time+',')
            else:
                outlist.write(""+',')
            if status == "O":
                outlist.write(time+',')
            else:
                outlist.write(""+',')
            outlist.write("Username"+'\n')
    outlist.close()


if __name__ == "__main__":
    site_code_dict = get_site_code_dict("file2.csv")
    time_list = get_time_list("file3.csv")
    process_raw("file1.csv", site_code_dict)

从csv文件输出数据:

101,Person1,01/13/16,3,10:38,,Username
103,Person1,01/20/16,5,,12:53,Username
102,Person2,01/21/16,7,,14:45,Username
101,Person3,01/17/16,5,12:17,,Username
102,Person3,01/25/16,3,10:15,,Username

通过上面的代码,我按顺序排列了这些列 第1列具有正确的代码 DATE列的日期恰好为&#39; mm / dd / yy&#39;格式。
TIME_IN列只有军事时间,如果记录是&#34;我&#34;或者&#34; L&#34;。
TIME_OUT列有军事时间,如果是&#34; O&#34;。
通过使用&#34;类&#34;我完成了这段时间。 TIMEPERIOD。

感谢您的帮助,因为我非常喜欢。

1 个答案:

答案 0 :(得分:0)

def get_site_code_dict(site_code_file):
    mydict = dict()
    with open(site_code_file) as inputs:
        for line in inputs:
            site,code = line.strip().split(",")
            mydict[site] = code
    return mydict


def process_raw(raw_file, site_code_dict):
    with open(raw_file) as inputs:
        for line in inputs:
            person, date_time, site, status = line.strip().split(",")
            outlist = list()
            outlist.append(site_code_dict[site])
            outlist.append(person)
            outlist.append(date_time)
            outlist.append(status)
            print ",".join(outlist)


if __name__ == "__main__":
    site_code_dict = get_site_code_dict("file2")
    process_raw("file1", site_code_dict)

输出:

101,Person1,01/13/16 10:38,I
103,Person1,01/20/16 12:53,O
102,Person2,01/21/16 14:45,O

您可以将键值对创建为get_site_code_dict以绑定站点名称和代码编号,然后使用它来处理原始数据。