数据重新格式化失败。使用python

时间:2015-06-18 17:10:44

标签: python csv

我的 cust_peformat_test.csv 文件包含以下内容:

AV-IM-1-13991730,6,2014-06-01 00:10,0.96
AV-IM-1-13991730,6,2014-06-01 00:15,0.92
AV-IM-1-13991730,6,2014-06-01 00:20,0.97
AV-IM-1-13991731,6,2014-06-01 00:10,1.96
AV-IM-1-13991731,6,2014-06-01 00:15,1.92
AV-IM-1-13991731,6,2014-06-01 00:20,1.97
AV-IM-1-13991732,6,2014-06-01 00:10,2.96
AV-IM-1-13991732,6,2014-06-01 00:15,2.92
AV-IM-1-13991732,6,2014-06-01 00:20,2.97

我编写了一个python脚本来重新格式化这个文件以生成另外两个文件,其内容如下所示:

文件-1: custpower.csv

    # file...... Recorder file
    # date...... Thu Mar 12 14:35:32 2015
    # user...... Sri
    # host...... (null)
    # group..... None
    # property.. Avista Measurements
    # limit..... 
    # interval..
    # timestamp
    2014-06-01 00:15,0.92,1.92,2.92
    2014-06-01 00:20,0.97,1.97,2.97
    2014-06-01 00:10,0.96,1.96,2.96,

文件-2:的 powersensornames.csv

AV-IM-1-13991730,AV-IM-1-13991731,AV-IM-1-13991732,

这正是我想要的,除非我的 cust_peformat_test.csv 的数据组织得不好并且如果它看起来像这样,否则它会很完美:

AV-IM-1-13991730,6,2014-06-01 00:10,0.96
AV-IM-1-13991730,6,2014-06-01 00:15,0.92
AV-IM-1-13991731,6,2014-06-01 00:15,1.92
AV-IM-1-13991731,6,2014-06-01 00:20,1.97
AV-IM-1-13991730,6,2014-06-01 00:20,0.97
AV-IM-1-13991731,6,2014-06-01 00:10,1.96
AV-IM-1-13991732,6,2014-06-01 00:10,2.96
AV-IM-1-13991732,6,2014-06-01 00:15,2.92
AV-IM-1-13991732,6,2014-06-01 00:20,2.97

弄乱了 custpower.csv 的内容,看起来像这样:

# file...... Recorder file
# date...... Thu Mar 12 14:35:32 2015
# user...... Sri
# host...... (null)
# group..... None
# property.. Avista Measurements
# limit..... 
# interval..
# timestamp
2014-06-01 00:15,1.96,2.96,,,2.92
2014-06-01 00:20,,,,,2.97

这是不正确的。尝试弄清楚我的代码有什么问题一直很痛苦,这是我的代码:

'''
Created on Jun 18, 2015

@author: sg
'''
#import datetime
#import csv
'''
#cust_power_real_recorder = open("Custmeters_preformat.csv",'w')
cust_power_real_reader = csv.reader(open("SPU123_customer_meters_power_kw.csv",'r'),delimiter=',')
spu123_meters=[]                                
for i,line in enumerate(cust_power_real_reader):
    if i>0:
        #d = datetime.datetime.strptime(line[6],'%Y-%m-%d %H:%M:%S')
        if line[5][8:] not in spu123_meters:
            spu123_meters.append(line[5][8:])
        #cust_power_real_recorder.writelines([line[5],',6,',line[6],',',line[10],'\n'])
#cust_power_real_recorder.close()
'''

'''open('data.csv','w').write(
"""\
13986513,6,6/1/2014 12:00:00 AM,248.7
13986513,6,6/1/2014 12:00:05 AM,248.4
13986513,6,6/1/2014 12:00:10 AM,249
13986513,6,6/1/2014 12:00:15 AM,249.3
13986513,6,6/1/2014 12:00:20 AM,249.3
13986513,6,6/1/2014 12:00:25 AM,249.3
13986513,6,6/30/2014 11:55:00 PM,249.3
13986534,6,6/1/2014 12:00:00 AM,249
13986534,6,6/1/2014 12:00:05 AM,249
13986534,6,6/1/2014 12:00:10 AM,249.3
13986534,6,6/1/2014 12:00:15 AM,249.6
13986534,6,6/30/2014 11:55:00 PM,249.7\
""")
'''
header = '''# file...... Recorder file
# date...... Thu Mar 12 14:35:32 2015
# user...... Sri
# host...... (null)
# group..... None
# property.. Avista Measurements
# limit..... 
# interval..''' 

#DECLARE THE FILE YOU WANT TO SPIT OUT

#testvolt        = open("testvolt.csv",'w')
#testvolt.writelines([header,'\n','# timestamp\n'])

testpower        = open("custpower.csv",'w')
testpower.writelines([header,'\n','# timestamp\n'])

class ReadSensorLines(object):

    def __init__(self, filename):

        sensor_offsets = {}
        sensors = []

        readfp = open(filename, "rb")
        readfp.readline() # skip header

        # find start of each sensor
        # use readline not iteration so that tell offset is right

        offset = readfp.tell()
        sensor = ''

        while True:
            line = readfp.readline()
            if not line:
                break
            next_sensor = line.split(',', 1)[0]
            if next_sensor != sensor:
                if sensor:
                    sensors.append(sensor)
                    next_offset = readfp.tell()
                    sensor_offsets[sensor] = [offset, next_offset - offset]
                    sensor = next_sensor
                    offset = next_offset
                else:
                    # setup for first sensor
                    sensor = next_sensor
        if next_sensor:
            sensors.append(next_sensor)
            sensor_offsets[next_sensor] = [offset, readfp.tell() - offset]

        self.readfp = readfp
        self.sensor_offsets = sensor_offsets
        self.sensors = sensors

    def read_sensor(self, sensorname):
        pos_data = self.sensor_offsets[sensorname]
        self.readfp.seek(pos_data[0])
        line = self.readfp.readline(pos_data[1])
        pos_data[0] += len(line)
        pos_data[1] -= len(line)
        return line

    @property
    def data_remains(self):
        return any(pos_data[1] for pos_data in self.sensor_offsets.itervalues())

    def close(self):
        self.readfp.close()

sensor_lines = ReadSensorLines("cust_peformat_test.csv") #READ THE CVS FILE U WANT TO MODIFY.
#In abive, delete.csv is for voltage recorder generation and Custmeters_preformat.csv is for power recorder generation
AllSensors=[]
while sensor_lines.data_remains:
    row = []
    for sensor in sensor_lines.sensors:
        if sensor not in AllSensors:
            AllSensors.append(sensor)
        sensor_line = sensor_lines.read_sensor(sensor)
        if sensor_line:
            _, _, date, volts = sensor_line.strip().split(',')
            row.append(volts)
        else:
            row.append('')
    row.insert(0, date)
    #print ','.join(row)
    #print row
    '''
    #below if else is ONLY for voltage csv files
    if '2014-06-' not in row[0]:
        row[0] = str(datetime.datetime.strptime(row[0],'%m/%d/%Y %H:%M'))
    else:
        row[0] = str(datetime.datetime.strptime(row[0],'%Y-%m-%d %H:%M:%S'))
    #voltage csv file if else case ENDS
    '''

    #testvolt.writelines([','.join(row),'\n']) # this is for voltage files
    testpower.writelines([','.join(row),'\n']) # this is for power files 
sensornames        = open("powersensornames.csv",'w') #THIS IS THE FILE WHERE THE HEADERS ARE WRITTEN
#In above, sensornames.csv is for voltage recorder and powersensornames.csv is for power recorder generation
for asensor in AllSensors:
    sensornames.writelines([asensor,','])

0 个答案:

没有答案