如何用Python批量下载txt中的FITS文件并转存为JPEG?
批量处理FITS文件:下载与格式转换
依赖安装
先安装所需Python包:
pip install requests astropy matplotlib
1. 批量下载FITS文件
读取URL文本文件,按001.fits、002.fits...的规则命名保存:
import os import requests # 自定义配置 url_list_file = "fits_urls.txt" # 存储URL的文本文件路径 fits_storage_dir = "fits_files" os.makedirs(fits_storage_dir, exist_ok=True) # 读取URL with open(url_list_file, "r", encoding="utf-8") as f: urls = [line.strip() for line in f if line.strip()] # 循环下载 for seq_num, url in enumerate(urls, start=1): save_name = f"{seq_num:03d}.fits" full_path = os.path.join(fits_storage_dir, save_name) try: resp = requests.get(url, stream=True) resp.raise_for_status() with open(full_path, "wb") as out_f: for chunk in resp.iter_content(chunk_size=8192): out_f.write(chunk) print(f"已下载:{save_name}") except Exception as err: print(f"下载失败 {url}:{str(err)}")
2. 批量转存为JPEG
遍历下载的FITS文件,转换为JPEG格式:
import os from astropy.io import fits import matplotlib.pyplot as plt # 自定义配置 fits_source_dir = "fits_files" jpeg_storage_dir = "jpeg_files" os.makedirs(jpeg_storage_dir, exist_ok=True) # 获取FITS文件列表(按命名排序) fits_files = sorted(f for f in os.listdir(fits_source_dir) if f.endswith(".fits")) # 循环转换 for fits_file in fits_files: fits_path = os.path.join(fits_source_dir, fits_file) jpeg_name = f"{fits_file.split('.')[0]}.jpg" jpeg_path = os.path.join(jpeg_storage_dir, jpeg_name) try: # 读取FITS数据 with fits.open(fits_path) as hdul: image_data = hdul[0].data # 生成JPEG plt.figure(figsize=(8, 8)) plt.imshow(image_data, cmap="gray") plt.axis("off") plt.savefig(jpeg_path, bbox_inches="tight", pad_inches=0, dpi=100) plt.close() print(f"已转换:{jpeg_name}") except Exception as err: print(f"转换失败 {fits_file}:{str(err)}")
关键说明
- URL文本文件需保证每行一个有效链接,无空行或多余空格
- 若FITS文件包含多扩展HDU,可修改
hdul[0]为对应扩展索引 - 可调整
cmap参数(如viridis、plasma)改变JPEG的色彩风格 - 分块下载(
stream=True)适合处理大体积FITS文件,避免内存溢出
内容的提问来源于stack exchange,提问作者Batman123
相关产品推荐
相关产品推荐

