Argparse生成输入和输出列表

2024-10-01 15:47:16 发布

您现在位置:Python中文网/ 问答频道 /正文

python新手

我的教授给了我一段代码来帮助处理一些图像,但是它一次只能处理一个图像,因为每次都需要规定输入和输出。通常我会把导入操作系统或glob,但argparse是新的东西,我通常的方法不工作。你知道吗

我需要编辑此文件,以便创建一个“.hdf”文件列表,其输出与输入相同,只是名称更改为_已处理.hdf'

代码如下:

# Import the numpy library
import numpy
# Import the GDAL library
from osgeo import gdal
# Import the GDAL/OGR spatial reference library
from osgeo import osr
# Import the HDF4 reader.
import pyhdf.SD
# Import the system library
import sys
# Import the python Argument parser
import argparse
import pprint
import rsgislib    

def creatGCPs(lat_arr, lon_arr):

    y_size = lat_arr.shape[0]
    x_size = lat_arr.shape[1]
    print(x_size)
    print(y_size)

    gcps = []
    for y in range(y_size):
        for x in range(x_size):
            gcps.append([x, y, lon_arr[y,x], lat_arr[y,x]])
    return gcps


def run(inputFile, outputFile):   
    hdfImg = pyhdf.SD.SD(inputFile)
    #print("Available Datasets")
    pprint.pprint(hdfImg.datasets())
    #print("Get Header Attributes")
    #attr = hdfImg.attributes(full=1)
    #pprint.pprint(attr)
    rsgisUtils = rsgislib.RSGISPyUtils()
    wktStr = rsgisUtils.getWKTFromEPSGCode(4326)
    #print(wktStr)

    lat_arr = hdfImg.select('Latitude')[:]
    long_arr = hdfImg.select('Longitude')[:]    
    sel_dataset_arr = hdfImg.select('Optical_Depth_Land_And_Ocean')[:]

    gcplst = creatGCPs(lat_arr, long_arr)


    y_size = lat_arr.shape[0]
    x_size = lat_arr.shape[1]

    min_lat = numpy.min(lat_arr)
    max_lat = numpy.max(lat_arr)
    min_lon = numpy.min(long_arr)
    max_lon = numpy.max(long_arr)

    lat_res = (max_lat-min_lat)/float(y_size)
    lon_res = (max_lon-min_lon)/float(x_size)

    driver = gdal.GetDriverByName( "KEA" )
    metadata = driver.GetMetadata()
    dst_ds = driver.Create( outputFile, x_size, y_size, 1, gdal.GDT_Float32 )
    dst_ds.GetRasterBand(1).WriteArray(sel_dataset_arr)

    gcp_list = []
    for gcp_arr in gcplst:
        gcp = gdal.GCP(int(gcp_arr[2]), int(gcp_arr[3]), int(0), gcp_arr[0], gcp_arr[1])
        gcp_list.append(gcp)

    dst_ds.SetGCPs(gcp_list, wktStr)

    dst_ds = None



if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    # Define the argument for specifying the input file.
    parser.add_argument("-i", "--input", type=str, required=True,  help="Specify the input image file.")
    # Define the argument for specifying the output file.
    parser.add_argument("-o", "--output", type=str, required=True, help="Specify the output image file.")
    args = parser.parse_args()


    run(args.input, args.output)

Tags: theimportnumpyparsersizeminmaxpprint
2条回答

argparse docs here中,只需将nargs='*'添加到参数定义中即可。但是,请确保输入和输出文件的顺序相同。。。你知道吗

此外,还可以使用Python>;=3.4中的pathlib.Path对象which is now standard来处理文件名。你知道吗

因此,在顶部添加from pathlib import Path后,代码的最后一部分变成:

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    # Define the argument for specifying the input file.
    parser.add_argument("-i", " input", nargs='*', type=str, required=True,  help="Specify the input image file.")

    args = parser.parse_args()

    for input in args.input:
        output = Path(input).stem + '_Processed.hdf'
        run(input, output)

这里,args.input现在是一个字符串列表,所以我们对它进行迭代。.stem属性返回不带任何扩展名的文件名,我发现它比像input[:-4]这样只适用于特定扩展名长度的东西更干净。。。你知道吗

这在标准linux shell中很好地处理glob模式(我不知道其他情况如何)。你知道吗

例如,调用python this_script.py -i Image_*,处理文件名以“Image\开头的每个文件。你知道吗

您可以使用nargs='+'选项,因为您只有一个必需的参数,所以我建议您不要使用 input作为选项,而只需将脚本作为script_name.py input_file1 input_file2 input_file3 ...运行:

import os.path
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('input', nargs='+', help="Specify the input image file.")
    args = parser.parse_args()
    for filename in args.input:
        root, ext = os.path.splitext(filename)
        run(filename, ''.join((root, '_Processed', ext)))

相关问题 更多 >

    热门问题