Python for循环内调用os.system无执行无报错无输出问题咨询
问题原因与解决方法
核心问题梳理
- 遍历逻辑错误:直接对
data1(DataFrame对象)做for循环,默认遍历的是列名而非每行的指定列值,你的代码循环实际只会执行1次(因为仅选了第5列),拿到的是列名字符串,根本没有读取到每一行的OID数据 - URL参数赋值错误:
format传入的是固定字符串'oid',不是实际读取到的ID值,最终请求的地址是固定错误的,不可能拿到有效数据 - 输出文件名重复:所有下载任务都用
-O ztf.csv,后续下载会直接覆盖之前的文件,就算执行成功也只能拿到最后一个文件 - 无报错无输出是因为
os.system默认不会打印命令执行的输出和错误信息,执行失败也不会抛出Python异常,所以你看不到任何提示
修正方案
- 修正遍历方式,直接遍历读取到的第5列的所有行值即可,不需要额外创建
data1对象 - 把每行的实际OID值传入URL的占位符,文件名也加上OID避免覆盖
- 先打印构造好的命令确认正确性,也可以换成
subprocess模块捕获执行输出方便排查
修正后代码
import pandas as pd import os # 可选导入subprocess替代os.system,更方便排查问题 # import subprocess # 读取第5列,squeeze=True直接转成Series,无需额外建DataFrame oid_series = pd.read_csv("ztf1.csv", usecols=[5], header=0, squeeze=True) for oid in oid_series: # 把oid转成字符串,去除首尾空白避免格式问题 oid_str = str(oid).strip() # 文件名加入oid避免覆盖 cmd = f'wget --auth-no-challenge --user=xxxx@gmail.com --password=xxxx -O ztf_{oid_str}.csv "https://irsa.ipac.caltech.edu/cgi-bin/ZTF/nph_light_curves?ID={oid_str}&FORMAT=CSV"' # 先打印命令确认构造是否正确 print(f"执行命令:{cmd}") # 执行命令,打印返回码:0代表成功,非0代表执行失败 return_code = os.system(cmd) print(f"命令执行返回码:{return_code}") # 换成subprocess的写法可以直接拿到输出和错误信息,排查更方便 # result = subprocess.run(cmd, shell=True, capture_output=True, text=True) # print("标准输出:", result.stdout) # print("错误输出:", result.stderr) # print("返回码:", result.returncode)
内容的提问来源于stack exchange,提问作者Arghya Chakraborty
相关产品推荐
相关产品推荐

