0

我有数千个格式为 tmp2010.m01.nc 的文件,其中 2010 是任何一年,01 是任何一个月,例如(tmp1900.m02.nc、tmp1925.m12.nc 等)是文件。

我需要名称为 tmp1900m02.nc 和 tmp1925m12.nc 以便在 python 脚本中使用。

所以基本上,我需要知道如何删除多余的“。” 在年份和“m”之间

到目前为止,我已经尝试过:

    ren *.m*.nc ???????m*.nc
    ren *.m*.nc *m*.nc

这些都没有奏效。

或者解决我在 Python 中遇到的问题。如果我不重命名它,并保留所有文件原样,python 会将 tmp1900.m01.nc、tmp1900.m02.nc、...、tmp1900.m12.nc 合并到 tmp1900.nc 中,这是一个问题,因为我需要有每月的文件。我正在使用的 python 脚本(我知道它将与 tmp1900m01.nc 类型文件一起使用是:

    # Identify wet files 
    NCfiles = arcpy.ListFiles("wet*.nc")

    # Process: Make & Save NetCDF Raster Layer
    for filename in NCfiles:

        fileroot = os.path.splitext(filename)[0]
        outFile = OutputFolder + str(fileroot)+".lyr"

        if os.path.exists(outFile):
            print("File " + filename + " already exists, nothing will be done")
        else:
            print("Processing: " + filename)
            inNCfiles = os.path.join(arcpy.env.workspace, filename)
            fileroot = os.path.splitext(filename)[0]
            LayerName = fileroot
            outRaster = os.path.join(OutputFolder, fileroot)
            inRaster = os.path.join(OutputFolder, fileroot + ".lyr")

    arcpy.MakeNetCDFRasterLayer_md(inNCfiles, "wet", "lon", "lat", LayerName, "", "", "BY_VALUE")
    arcpy.SaveToLayerFile_management(LayerName,outRaster,"ABSOLUTE") 
4

2 回答 2

2

问题出在您的 Python 脚本中。与其尝试使用输入文件名来解决脚本中的错误,不如修复脚本。

你的第一个问题在这里:

fileroot = filename[0:(len(filename)-3)]

这看起来应该拆分一个扩展。但是,除了过于复杂(filename[0:(len(filename)-3)]与 完全相同filename[:-3])之外,考虑到您同时具有 2 个字符和 3 个字符的扩展名,这也是错误的。

os.path模块存在,因此您不必费力地做所有这些事情。只要打电话splitext

接下来,你有这个:

LayerName = str(filename).strip(r"*.nc")

这看起来应该剥离另一个扩展。由于不同的原因,它过于复杂(除了使用strip而不是splitext,究竟str(filename)应该做什么?filename还不是一个字符串?),并且由于不同的原因它也是错误的:你的文件不以"*.nc". 您不能将 glob(通配符)模式传递给strip. 而且,即使你可以,那不就是去掉整个文件名吗?

最重要的是,您不是将下一个扩展名从剥离filerootfilename.

所以:

print("Processing: " + filename)
inNCfiles = os.path.join(arcpy.env.workspace, filename)
fileroot = os.path.splitext(filename)[0]
LayerName, m_ext = os.path.splitext(fileroot)
outRaster = os.path.join(OutputFolder, fileroot)

对于最后一行,我不确定您是否想要图层文件tmp1900m01.lyr但它们是tmp1900.lyr,或者您是否在想要后者时抱怨它们是前者,或者您真正想要的是文件tmp1900.m01.lyr,就像.nc文件一样,但扩展名不同。但无论你想要哪一个,你现在都有足够的信息。LayerNametmp1900部分;m_ext.m01部分,也fileroot有整体tmp1900.m01。所以,它是其中之一:

inRaster = os.path.join(OutputFolder, LayerName + ".lyr")

inRaster = os.path.join(OutputFolder, LayerName + m_ext[1:] + ".lyr")

inRaster = os.path.join(OutputFolder, fileroot + ".lyr")

同时,您已将其添加到代码中:

outFile = OutputFolder + str(fileroot)+".lyr"

再说一次,我不知道你为什么要调用str已经是字符串的东西。有点令人困惑的是,您有一个名为的文件inRaster和一个名为的文件outFile,它们应该是同一个东西(它是输入文件还是输出文件?)。更重要的是,我不知道您为什么要尝试以两种不同的方式计算完全相同的路径。

但显然,只要你这样做,你就必须让它们都正确。正确inRaster设置为tmp1900.m01.lyr对您没有任何好处,如果outFiletmp1900.lyr,那是您实际用于打开文件的名称。


附带说明一下,无论何时使用os.path.exists,您都可能做错了。如果出现问题,尝试打开文件并处理它通常更简单、更健壮。例如,如果您只是open使用 mode x,如果文件已经存在,它将引发异常。只需处理该异常并继续下一个文件名。

于 2013-06-24T23:31:41.803 回答
0

只需将第一个时期替换为空

file_names = ["tmp1900.m02.nc", "tmp1925.m12.nc"]
for file_name in file_names:
    new_file_name = file_name.replace('.', '', 1)
    print new_file_name
于 2013-06-24T23:24:22.860 回答