new file: downloads/Non_TMD/free_vib/free_decay.csv new file: downloads/Non_TMD/free_vib/free_vibration.csv new file: downloads/Non_TMD/test/Kobe_seismic_wave.csv new file: downloads/Non_TMD/test/Northridge_seismic_wave.csv new file: downloads/Non_TMD/train/harmonic_5mm_0.55Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_0.5Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_0.65Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_0.6Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_0.7Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_0.85Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_0.8Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_0.9Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.05Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.15Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.1Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.2Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.35Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.3Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.45Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.4Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.5Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.65Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.6Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.75Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.7Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.8Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.95Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1.9Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_1Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.05Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.15Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.1Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.25Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.2Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.35Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.3Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.45Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.4Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2.5Hz.csv new file: downloads/Non_TMD/train/harmonic_5mm_2Hz.csv new file: downloads/Non_TMD/val/harmonic_5mm_0.75Hz.csv new file: downloads/Non_TMD/val/harmonic_5mm_0.95Hz.csv new file: downloads/Non_TMD/val/harmonic_5mm_1.25Hz.csv new file: downloads/Non_TMD/val/harmonic_5mm_1.55Hz.csv new file: downloads/Non_TMD/val/harmonic_5mm_1.85Hz.csv new file: downloads/TMD/train/harmonic_5mm_0.5Hz_TMD.csv new file: downloads/TMD/train/harmonic_5mm_1.5Hz_TMD.csv new file: downloads/TMD/train/harmonic_5mm_1Hz_TMD.csv new file: downloads/TMD/val/harmonic_5mm_0.75Hz_TMD.csv new file: downloads/TMD/val/harmonic_5mm_1.25Hz_TMD.csv new file: src/__init__.py new file: src/__pycache__/config.cpython-310.pyc new file: src/__pycache__/config.cpython-314.pyc new file: src/__pycache__/dataset.cpython-310.pyc new file: src/__pycache__/dataset.cpython-314.pyc new file: src/__pycache__/model.cpython-310.pyc new file: src/__pycache__/model.cpython-314.pyc new file: src/config.py new file: src/dataset.py new file: src/evaluate.py new file: src/model.py new file: src/train.py new file: "\346\225\260\346\215\256\351\223\276\346\216\245.txt"
117 lines
3.5 KiB
Python
117 lines
3.5 KiB
Python
#!/usr/bin/env python3
|
||
import argparse
|
||
import json
|
||
import os
|
||
import re
|
||
import ssl
|
||
import urllib.error
|
||
import urllib.parse
|
||
import urllib.request
|
||
|
||
|
||
def sanitize_filename(name: str) -> str:
|
||
sanitized = name.strip()
|
||
sanitized = re.sub(r'[<>:"/\\|?*\x00-\x1f]', '_', sanitized)
|
||
sanitized = re.sub(r'\s+', ' ', sanitized)
|
||
return sanitized
|
||
|
||
|
||
def unique_path(path: str) -> str:
|
||
base, ext = os.path.splitext(path)
|
||
counter = 1
|
||
while os.path.exists(path):
|
||
path = f"{base} ({counter}){ext}"
|
||
counter += 1
|
||
return path
|
||
|
||
|
||
def download_file(url: str, dest_path: str, verify_ssl: bool = True) -> None:
|
||
req = urllib.request.Request(url, headers={
|
||
'User-Agent': 'Mozilla/5.0 (Python urllib)'
|
||
})
|
||
context = None
|
||
if not verify_ssl:
|
||
context = ssl.create_default_context()
|
||
context.check_hostname = False
|
||
context.verify_mode = ssl.CERT_NONE
|
||
|
||
with urllib.request.urlopen(req, timeout=60, context=context) as response:
|
||
data = response.read()
|
||
with open(dest_path, 'wb') as out_file:
|
||
out_file.write(data)
|
||
|
||
|
||
def get_extension_from_url(url: str) -> str:
|
||
path = urllib.parse.urlparse(url).path
|
||
ext = os.path.splitext(path)[1]
|
||
return ext if ext else '.bin'
|
||
|
||
|
||
def main() -> None:
|
||
parser = argparse.ArgumentParser(
|
||
description='从 数据链接.txt 下载每个 file_url,并根据 name 重命名到指定目录。'
|
||
)
|
||
parser.add_argument(
|
||
'--input', '-i', default='数据链接.txt',
|
||
help='输入 JSON 文件,默认:数据链接.txt'
|
||
)
|
||
parser.add_argument(
|
||
'--output-dir', '-o', default='downloads',
|
||
help='输出目录,默认:downloads'
|
||
)
|
||
parser.add_argument(
|
||
'--ignore-ssl', action='store_true',
|
||
help='忽略 SSL 证书验证,适用于证书链不完整的服务器'
|
||
)
|
||
args = parser.parse_args()
|
||
|
||
os.makedirs(args.output_dir, exist_ok=True)
|
||
|
||
with open(args.input, 'r', encoding='utf-8') as infile:
|
||
source = json.load(infile)
|
||
|
||
records = []
|
||
if isinstance(source, dict):
|
||
records = source.get('data', {}).get('records', [])
|
||
elif isinstance(source, list):
|
||
records = source
|
||
|
||
if not isinstance(records, list):
|
||
raise ValueError('无法从输入文件中解析 records 列表。')
|
||
|
||
for record in records:
|
||
if not isinstance(record, dict):
|
||
continue
|
||
name = record.get('name')
|
||
url = record.get('file_url')
|
||
if not name or not url:
|
||
print('跳过:缺少 name 或 file_url。', record)
|
||
continue
|
||
|
||
clean_name = sanitize_filename(name)
|
||
ext = get_extension_from_url(url)
|
||
dest_name = f'{clean_name}{ext}'
|
||
dest_path = os.path.join(args.output_dir, dest_name)
|
||
dest_path = unique_path(dest_path)
|
||
|
||
try:
|
||
print(f'正在下载: {url} -> {dest_path}')
|
||
download_file(url, dest_path, verify_ssl=not args.ignore_ssl)
|
||
except urllib.error.URLError as exc:
|
||
if 'CERTIFICATE_VERIFY_FAILED' in str(exc) and not args.ignore_ssl:
|
||
print('SSL 证书验证失败,重试时忽略证书验证。')
|
||
try:
|
||
download_file(url, dest_path, verify_ssl=False)
|
||
except Exception as exc2:
|
||
print(f'下载失败: {url}\n原因: {exc2}')
|
||
else:
|
||
print(f'下载失败: {url}\n原因: {exc}')
|
||
except Exception as exc:
|
||
print(f'保存失败: {dest_path}\n原因: {exc}')
|
||
|
||
print('下载完成。')
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|