0

ファイルを通過し、一時ファイルとして編集し、一時ファイルを新しいファイルにコピーして編集するコードを書いています。ただし、shutil から move メソッドを使用すると、次のエラーが発生し続けます。

IOError: [Errno 22] 引数が無効です

copy、copy2、およびcopyfileを使用してみました。コードのコピーは次のとおりです。

def writePPS(seekValue,newData):
    PPSFiles = findPPS("/pps")
    for file in PPSFiles:
        #create a temp file
        holder,temp = mkstemp(".pps")
        print holder, temp
        pps = open(file,"r+")
        newpps = open(temp,"w")
        info = pps.readlines()
        #parse through the pps file and find seekvalue, replace with newdata
        for data in info:
            valueBoundry = data.find(":")
            if seekValue == data[0:(valueBoundry)]:
                print "writing new value"
                newValue = data[0:(valueBoundry+1)] + str(newData)
                #write to our temp file
                newpps.write(newValue)
            else: newpps.write(data)
        pps.close()
        close(holder)
        newpps.close()
        #remove original file
        remove(file)
        #move temp file to pps
        copy(temp,"/pps/ohm.pps")
4

1 に答える 1

1

なぜそのエラーが発生するのか正確にはわかりませんが、まず、コードを少しクリーンアップして、これらのインポート ステートメントをすべて修正してみてください。関数がどこから来ているのかを確認するのは難しく、最終的に名前空間の衝突が発生する可能性があることはわかっています。

実際に実行可能なコードから始めましょう。

import shutil
import os
import tempfile

def writePPS(seekValue,newData):
    PPSFiles = findPPS("/pps")
    for file_ in PPSFiles:
        #create a temp file
        newpps = tempfile.NamedTemporaryFile(suffix=".pps")
        print newpps.name
        with open(file_,"r+") as pps:
            #parse through the pps file and find seekvalue, replace with newdata
            for data in pps:
                valueBoundry = data.find(":")
                if seekValue == data[0:(valueBoundry)]:
                    print "writing new value"
                    newValue = data[0:(valueBoundry+1)] + str(newData)
                    #write to our temp file
                    newpps.write(newValue)
                else: 
                    newpps.write(data)

            #move temp file to pps
            newpps.flush()
            shutil.copy(newpps.name,"/pps/ohm.pps")

すべての行をメモリに読み込む必要はありません。各行をループするだけです。また、ファイルのオープン/クローズ操作をすべて管理する必要もありません。withコンテキストと NamedTemporaryFile を使用するだけで、ガベージ コレクション時にクリーンアップされます。

あなたの例と上記では、すべてのソースファイルに対して毎回同じ宛先ファイルを上書きしていることに注意してください。あなたが対処するために、私はそれをそのままにしておきました。しかし、ここから始めれば、エラーが発生する理由を理解し始めることができます。

于 2012-06-25T18:24:09.180 に答える