Download- Smile.zip -3.16 Mb- -

# 3. Image stats (if any) img_info = [] for p in ROOT.rglob('*.jpg') + ROOT.rglob('*.png'): try: with Image.open(p) as im: img_info.append( 'path': str(p.relative_to(ROOT)), 'width': im.width, 'height': im.height, 'mode': im.mode, 'size_bytes': p.stat().st_size ) except Exception as e: img_info.append('path': str(p), 'error': str(e))

out['image_stats'] = pd.DataFrame(img_info) Download- smile.zip -3.16 MB-

out['csv_summaries'] = csv_summaries

# 4. CSV inspection (first few rows) csv_summaries = {} for p in ROOT.rglob('*.csv'): try: df = pd.read_csv(p) csv_summaries[str(p.relative_to(ROOT))] = 'rows': len(df), 'cols': len(df.columns), 'col_names': list(df.columns), 'missing_perc': (df.isna().mean()*100).to_dict() except Exception as e: csv_summaries[str(p)] = 'error': str(e) paths in hashes.items() if len(paths) &gt

duplicates = h:paths for h,paths in hashes.items() if len(paths) > 1 out['duplicates'] = duplicates 'w') as f: json.dump(out

# Save everything for the paper with open('audit_report.json', 'w') as f: json.dump(out, f, indent=2)