ok, I was interested in the problem (a similar problem recently occurred) and worked a little on it. you can try something like this:
import io import datetime from csv import DictReader file0 = io.StringIO('''timestamp,data 2015-06-01 10:00, data00 2015-06-01 11:00, data01 2015-06-01 12:00, data02 2015-06-01 12:30, data03 2015-06-01 13:00, data04 ''') file1 = io.StringIO('''timestamp,data 2015-06-01 09:00, data10 2015-06-01 10:30, data11 2015-06-01 11:00, data12 2015-06-01 12:30, data13 ''') class Data(object): def __init__(self): self.timestamp = None self.data = None @staticmethod def new_from_dict(dct=None): if dct is None: return None ret = Data() ret.data = dct['data'].strip() ret.timestamp = datetime.datetime.strptime(dct['timestamp'], '%Y-%m-%d %H:%M') return ret def __lt__(self, other): if other is None: return False return self.timestamp < other.timestamp def __gt__(self, other): if other is None: return False return self.timestamp > other.timestamp def __str__(self): ret = '{0.__class__.__name__}'.format(self) +\ '(timestamp={0.timestamp}, data={0.data})'.format(self) return ret def next_or_none(reader): try: return Data.new_from_dict(next(reader)) except StopIteration: return None def yield_in_order(reader0, reader1): data0 = next_or_none(reader0) data1 = next_or_none(reader1) while not data0 == data1 == None: if data0 is None: yield None, data1 data1 = next_or_none(reader1) continue if data1 is None: yield data0, None data0 = next_or_none(reader0) continue while data0 < data1: yield data0, None data0 = next_or_none(reader0) while data0 > data1: yield None, data1 data1 = next_or_none(reader1) if data0 is not None and data1 is not None: if data0.timestamp == data1.timestamp: yield data0, data1 data0 = next_or_none(reader0) data1 = next_or_none(reader1) csv0 = DictReader(file0) csv1 = DictReader(file1) FMT = '{!s:50s} | {!s:50s}' print(FMT.format('file0', 'file1')) print(101*'-') for dta0, dta1 in yield_in_order(csv0, csv1): print(FMT.format(dta0, dta1))
it is only for 2 files.
hiro protagonist
source share