import json from datetime import datetime, timedelta from functools import reduce from pprint import pprint import boto3 from boto3.dynamodb.conditions import Key, Attr, And, Or dynamodb = boto3.resource('dynamodb', region_name='us-east-1') table = dynamodb.Table('prod-carveout_change_log') def day_list(s1, s2): start = datetime.strptime(s1, "%Y-%m-%d") end = datetime.strptime(s2, "%Y-%m-%d") return [(start + timedelta(days=n)).strftime('%Y-%m-%d') for n in range((end - start).days + 1)] dates = day_list('2020-11-24', '2020-12-11') date_exp = reduce(lambda a, x: Or(a, Key('date_added').begins_with(x)), dates[1:], Key('date_added').begins_with(dates[0])) scan_kwargs = { 'FilterExpression': And(Attr('change_details').begins_with('Territories'), date_exp), 'ProjectionExpression': "date_added, upc, user_name, change_details" } done = False start_key = None data = [] while not done: if start_key: scan_kwargs['ExclusiveStartKey'] = start_key response = table.scan(**scan_kwargs) items = response.get('Items', []) if len(items) > 0: data.extend(items) print(f"{len(data)} found") start_key = response.get('LastEvaluatedKey', None) done = (start_key is None) with open("data_file.json", "w") as write_file: json.dump(data, write_file, indent=2, sort_keys=True) # while 'LastEvaluatedKey' in response: # response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey']) # data.extend(response['Items'])