import csv, tempfile, os, re import struct import time import numpy as np import argparse import paramiko import shutil import configparser from ftplib import FTP from pathlib import Path from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from datetime import datetime def parse_sif_csv(_file_path): _metadata = {} _wavelengths = [] _spectra_data = [] with open(_file_path, encoding='utf-8') as f: reader = csv.reader(f) rows = list(reader) # 第1行:除了第一列,后续是变量名和值交替出现 row1 = rows[0][1:] for i in range(0, len(row1), 2): if i + 1 < len(row1): _metadata[row1[i]] = row1[i + 1] # 第2行:前一个是变量名,后一个是变量值 if len(rows) > 1 and len(rows[1]) >= 2: _metadata[rows[1][0]] = rows[1][1] # 第3行:除了第一列,后续是变量名和值交替出现 row3 = rows[2][1:] for i in range(0, len(row3), 2): if i + 1 < len(row3): _metadata[row3[i]] = row3[i + 1] # 第4行是波长 _wavelengths = np.array([float(w) for w in rows[3][1:]]) # 第5行忽略 # 从第6行开始是光谱数据 for row in rows[5:]: if len(row) < 4 or row[1].lower() != "valid": continue # 跳过表头或无效行 try: entry = { "Location": row[0], "Valid": row[1], "Integration": int(row[2]), "DN": np.array([float(val) for val in row[3:]]) } _spectra_data.append(entry) except ValueError: continue # 跳过不能解析的行 return _metadata, _wavelengths, _spectra_data def read_cal(_file_path): # 定义结构体格式 # unsigned int (4) + float (4) + int (4) + 4096 floats (4 each) + 4096 doubles (8 each) + 4096 doubles (8 each) fmt = '