python MergeReportsNoir/merge_reports.py --product product360 --version 1.0.0
Скрипт находит все `report.csv` и `unmatched_swagger.csv` в подпапках папки input/
Пример: input/report1/ input/report2/
Склеивает.
Сохраняет результат в папку output/ с именами:
- `{product}-report-noir.csv`
- `{product}-report-unmatched-swagger.csv`
--
#!/usr/bin/env python3
"""Merge Noir reports from multiple subdirectories in the input folder."""
import argparse
import os
import shutil
import glob
def main():
parser = argparse.ArgumentParser(description="Merge Noir reports from input folders.")
parser.add_argument("--product", required=True, help="Product name (e.g., product)")
parser.add_argument("--version", required=True, help="Version identifier (e.g., 1.0.0)")
args = parser.parse_args()
script_dir = os.path.dirname(os.path.abspath(__file__))
input_dir = os.path.join(script_dir, "input")
output_dir = os.path.join(script_dir, "output")
# Ensure output directory exists
os.makedirs(output_dir, exist_ok=True)
output_report = os.path.join(output_dir, f"{args.product}-{args.version}-report-noir.csv")
output_unmatched = os.path.join(output_dir, f"{args.product}-{args.version}-report-unmatched-swagger.csv")
# Collect all report.csv and unmatched_swagger.csv from subdirectories
report_files = sorted(glob.glob(os.path.join(input_dir, "*", "report.csv")))
unmatched_files = sorted(glob.glob(os.path.join(input_dir, "*", "unmatched_swagger.csv")))
# Merge report.csv files (header from first file, then data rows from all)
header_written = False
with open(output_report, "w", encoding="utf-8", newline="") as out:
for filepath in report_files:
with open(filepath, "r", encoding="utf-8", newline="") as f:
lines = f.readlines()
if not header_written:
out.writelines(lines) # write header + data
header_written = True
else:
out.writelines(lines[1:]) # skip header, write data only
# Merge unmatched_swagger.csv files (header from first file, then data rows from all)
header_written = False
with open(output_unmatched, "w", encoding="utf-8", newline="") as out:
for filepath in unmatched_files:
with open(filepath, "r", encoding="utf-8", newline="") as f:
lines = f.readlines()
if not header_written:
out.writelines(lines) # write header + data
header_written = True
else:
out.writelines(lines[1:]) # skip header, write data only
print(f"Merged {len(report_files)} report(s) -> {output_report}")
print(f"Merged {len(unmatched_files)} unmatched swagger report(s) -> {output_unmatched}")
print(f"Input subdirectories cleared.")
if __name__ == "__main__":
main()