[请教]Windows Error Error 32 os.rename出错的问题

[请教]Windows Error Error 32 os.rename出错的问题

实现的功能是检查目录和子目录下的文件,如果后缀是.htm的,删除,如果是.txt的,读取第一行的内容,作为新的文件名,下面是源码

# coding=gbk
import os

def loop(p):
    workdir=p
    os.chdir(workdir)
    cwd=os.getcwd()
#    print cwd
    dirs=os.listdir(cwd)
#    print dirs
    for tmp in dirs:
        path=os.path.join(cwd,tmp)
        print path
        if os.path.isfile(path):
            if tmp[-4:]=='.htm':
                os.remove(path)
                print 'del',path
            elif tmp[-4:]=='.txt':
                f=open(path,'r')
                s=f.readline()
                s=s[:-1]
                s=s+'.txt'
                print 'os.rename(\''+tmp+'\',\''+s+'\')'
                try:
                    os.renames(tmp,s)
                except WindowsError,e:
                    print e
                    raise e
                print 'rename',tmp,s
                i=i+1
                pass
        elif os.path.isdir(path):
            loop(path)
loop(r'E:\旧元元图书馆合集')

运行的结果是这样的

E:\旧元元图书馆合集\chevalier
E:\旧元元图书馆合集\chevalier\acm_002b.txt
os.rename('acm_002b.txt','四海龙女.txt')
Traceback (most recent call last):
  File "G:\my.py", line 34, in <module>
    loop(r'E:\旧元元图书馆合集')
  File "G:\my.py", line 33, in loop
    loop(path)
  File "G:\my.py", line 27, in loop
    os.renames(tmp,s)
  File "D:\Python25\lib\os.py", line 213, in renames
    rename(old, new)
WindowsError: [Error 32]

输出的文件名应该没有错误啊,百思不得其解,求教?
os.renames(tmp,s)

传入的应该是完整路径把,你这个地方只是文件名,不是路径哦
解决了
Error 32是文件已经打开的错误,我忘记在改名前关闭文件了
后来又出了
Error 183是文件已存在的问题,如果反复运行的话,会出这个问题
解决后还有一点是读入的第一行文字前面可能有很多全角空格,我重新写了一个rename函数,解决了问题

修改后的源码
import os


def rename(old,new):
    print 'begin to rename',old,new
    new2=''
    for i in range(0,len(new)-1,2):
        a=new[i:i+2]
        if a!='\xa1@':
            new2+=a;
    print 'new name =',new2
    if new2!=old:
        os.rename(old,new2)
        print 'rename',old,'to',new2
        
def loop(p):
    i=0
    workdir=p
    os.chdir(workdir)
    cwd=os.getcwd()
    dirs=os.listdir(cwd)
    for tmp in dirs:
        path=os.path.join(cwd,tmp)
        print 'path=',path
        if os.path.isfile(path):
            if tmp[-4:]=='.htm':
                os.remove(path)
                print 'del',path
            elif tmp[-4:]=='.txt':
                f=open(path,'r')
                s=f.readline()
                f.close()
                s=s[:-1]
                print'first line =',s
                s=s+'.txt'
                try:
                    rename(tmp,s)
                except WindowsError,e:
                    if str(e)=='[Error 183] ':
                        os.remove(path)
                        print 'del ',path

        elif os.path.isdir(path):
            loop(path)
            
loop(r'E:\test')
上面的代码也有问题,有的文件是第一行相同但是内容不同,不应该删除文件,应该重命名才对,再次修改了程序

#  -*- coding: gbk -*-
'''
这个模块可以用来对一个路径已经其子路径下的文件进行修改,它会删除所有的.htm文件,遇到.txt文
件它会读取第一行,去掉全角空格作为文件名
'''
import os

def _rename(old,new):
    new2=''
    for i in range(0,len(new),2):
        a=new[i:i+2]
        if a!='\xa1@':
            new2+=a;
   
    print 'new name =',new2
    print 'old name =',old
    if new2!=old:
        print 'begin to rename',old,new2
        try:
            os.rename(old,new2)
        except WindowsError,e:
            if str(e)=='[Error 183] ':
                print 'already have ',new2
                new2=new2[:-5]+str(int(new2[-5])+1)+'.txt'
                print 'save as',new2
                rename(old,new2)
                print 'rename',old,'to',new2
        
def excuepath(p):
    '传递需要进行处理的路径作为参数'
    workdir=p
    os.chdir(workdir)
    cwd=os.getcwd()
    dirs=os.listdir(cwd)
    for tmp in dirs:
        path=os.path.join(cwd,tmp)
        print 'path=',path
        if os.path.isfile(path):
            if tmp[-4:]=='.htm':
                os.remove(path)
                print 'del',path
            elif tmp[-4:]=='.txt':
                f=open(path,'r')
                s=f.readline()
                f.close()
                s=s[:-1]
                print'first line =',s
                s=s+'0.txt'
                try:
                    _rename(tmp,s)
                except WindowsError,e:
                    if str(e)=='[Error 183] ':
                        s=s+'1'

        elif os.path.isdir(path):
            loop(path)

if __name__=='__main__':
    loop(r'E:\ABCTemp\')
感谢分享。