【问题标题】:renaming issue in cmdcmd中的重命名问题
【发布时间】:2013-06-21 14:57:24
【问题描述】:

我有数千个格式为 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") 

【问题讨论】:

  • 你想用fileroot = filename[0:(len(filename)-3)]做什么?首先,这与filename[:-3] 相同。其次,如果您试图以这种方式剥离扩展,那么如果您的扩展可以是不同的长度,那将不起作用——就像在您的示例中那样(.nc.lyr)。使用os.path.splitext——这就是它的用途。

标签: python cmd rename


【解决方案1】:

只需将第一个句点替换为空

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

【讨论】:

    【解决方案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 而不是splitextstr(filename) 到底应该做什么?filename 还不是一个字符串吗?),并且由于不同的原因它也是错误的:你的文件不以"*.nc" 结尾。您不能将 glob(通配符)模式传递给 strip。而且,即使可以,那不就是去掉整个文件名吗?

    最重要的是,您不是从剥离的fileroot 中拆分下一个扩展名,而是从原始filename 中重新剥离相同的扩展名。

    所以:

    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,或者您是否在抱怨 em> 当你想要后者时它们是前者,或者你实际上想要的是像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 的文件应该是同一件事(是输入文件还是输出文件?)。更重要的是,我不知道您为什么要尝试以两种不同的方式计算完全相同的路径。

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


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

    【讨论】:

    • 谢谢!我更改了脚本并将其放在我原来的帖子中。不幸的是,.lyr 文件仍然是 tmp1900.lyr 而不是 tmp1900m01.lyr。
    • @user12279:好的,现在我对你想要做什么有了更多的了解。它可能会帮助您在调试器或interactive visualizer 中逐步完成此操作,或者只是将每个中间值导出到print,并准确解释您期望每个变量包含什么。但我认为我的回答现在解释了它。
    • @user12279: 等等,没关系,我看到你做了另一个更改:你有outFile = OutputFolder + str(fileroot)+".lyr",这当然与你在inRaster 中重新创建相同路径名的尝试无关,所以你在那里做的任何事情都不会被修复。让我再编辑一次……
    猜你喜欢
    • 2017-12-18
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多