import multiprocessing import traceback import sys import boto3 import botocore import mysql import query import config BUCKET = 'dev-orcd-raw-assets' PAGE_SIZE = 100 THREADS = 12 s3_client = boto3.client('s3') paginator_config = { 'PageSize': PAGE_SIZE } def check_file(arguments): k = arguments[0] e = True try: s3_client.head_object(Bucket=BUCKET, Key=k) except botocore.exceptions.ClientError: e = False return k, e if __name__ == '__main__': with mysql.mysql_connection(**config.DB_CONFIG) as conn: with conn.cursor() as cursor: cursor.execute(query.SELECT_SONGS) songs = list(cursor) files = [] missing = [] for song in songs: files.append('{}{}{}'.format(song['path'], song['song_name'], song['extension'])) pool = multiprocessing.Pool(THREADS) iterator = pool.imap_unordered(check_file, list(zip(files))) while True: try: key, exists = next(iterator) except multiprocessing.TimeoutError: continue except StopIteration: break except Exception: # Print traceback because we can't reraise it here traceback.print_exc(file=sys.stdout) else: if not exists: print('missing {}'.format(key)) missing.append(key) pool.close() pool.join() with open('missings.csv', 'w') as txt_file: for file in missing: txt_file.write('prod-orcd-raw-assets,' + file + '\n') # paginator = s3_client.get_paginator('list_objects') # page_iterator = paginator.paginate( # Bucket=BUCKET, # Prefix=PREFIX, # PaginationConfig=paginator_config # ) # files = [] # for page in page_iterator: # items = page['Contents'] # One page of image files. # for item in items: # key = item['Key'] # files.append('dev-orcd-raw-asset,{}'.format(key)) # with open('files2.csv', 'w') as txt_file: # for file in files: # txt_file.write(file + '\n')