我有数千个文件,格式为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")
答案 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
文件一样具有不同的扩展名。但无论你想要哪一个,你现在都有足够的信息。 LayerName
有tmp1900
部分; 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
并且您实际用于打开文件的名称,则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