Shutil移动函数给出了无效的争论错误PYTHON

时间:2012-06-25 18:01:41

标签: python shutil

我正在编写一些代码,这些代码将通过一个文件,将其编辑为临时文件,然后将临时文件复制到新文件中以进行编辑。但是当从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")

1 个答案:

答案 0 :(得分:1)

我不确定你为什么会收到这个错误,但是开始你可以尝试清理你的代码并修复所有这些import语句。很难看出函数的来源,而且你知道最终会发生命名空间冲突。

让我们从一些实际可运行的代码开始:

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,它将在垃圾收集时自行清理。

重要提示,在您的示例及上述内容中,每次为每个源文件覆盖相同的目标文件。我就是这样留给你解决的。但是如果你从这里开始,我们就可以开始弄清楚你为什么会遇到错误。