0

tmp2010.m01.nc という形式のファイルが何千もあります。2010 年は任意の年、01 は任意の月です。たとえば、(tmp1900.m02.nc、tmp1925.m12.nc など) はファイルです。

Python スクリプトで使用するには、名前を tmp1900m02.nc および tmp1925m12.nc にする必要があります。

基本的に、余分な「。」を削除する方法を知る必要があります。年と「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。そして、できたとしても、ファイル名全体を削除するだけではありませんか?

その上、ストリップされた から次の拡張子を分割する代わりに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.ncLayerNametmp1900m_ext.m01fileroottmp1900.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が同じものであると想定されていることは少し混乱しています(入力ファイルですか、それとも出力ファイルですか?)。さらに重要なのは、まったく同じパスを 2 つの異なる方法で計算しようとしている理由がわかりません。

しかし、明らかに、それを行う限り、両方を正しく取得する必要があります. inRasterに正しく設定しても、ファイルを開くために実際に使用する名前である場合、何の役にも立ちtmp1900.m01.lyrません。outFiletmp1900.lyr


補足として、 を使用しているときはいつでも、os.path.exists間違っている可能性があります。多くの場合、ファイルを開いて問題が発生した場合に対処する方が簡単で堅牢です。たとえば、openmode だけを使用する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 に答える