在cmd中重命名问题

时间:2013-06-24 23:21:20

标签: python cmd rename

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

2 个答案:

答案 0 :(得分: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。而且,即使你可以,也不会只是删除整个文件名?

除此之外,您还可以从原始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,或者您是否抱怨当你想要后者时,他们是前者,或者你实际想要的是tmp1900.m01.lyr之类的文件,就像.nc文件一样具有不同的扩展名。但无论你想要哪一个,你现在都有足够的信息。 LayerNametmp1900部分; m_ext部分为.m01fileroot部分为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的文件应该是同一个东西(它是输入文件还是输出文件?),这有点令人困惑。更重要的是,我不知道你为什么试图用两种不同的方式计算完全相同的路径。

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


作为旁注,每当您使用os.path.exists时,您可能会做错了。如果出现问题,只需尝试打开文件并处理它就会更简单,更健壮。例如,如果您只使用模式open x,则在文件已存在时会引发异常。只需处理该异常并继续下一个文件名。

答案 1 :(得分: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