免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 15976 | 回复: 4
打印 上一主题 下一主题

[请教]Windows Error Error 32 os.rename出错的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-17 09:14 |只看该作者 |倒序浏览
实现的功能是检查目录和子目录下的文件,如果后缀是.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]

输出的文件名应该没有错误啊,百思不得其解,求教?

论坛徽章:
0
2 [报告]
发表于 2008-07-17 11:34 |只看该作者
os.renames(tmp,s)

传入的应该是完整路径把,你这个地方只是文件名,不是路径哦

论坛徽章:
0
3 [报告]
发表于 2008-07-17 11:37 |只看该作者
解决了
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')

论坛徽章:
0
4 [报告]
发表于 2008-07-17 19:15 |只看该作者
上面的代码也有问题,有的文件是第一行相同但是内容不同,不应该删除文件,应该重命名才对,再次修改了程序

#  -*- 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\')

论坛徽章:
0
5 [报告]
发表于 2008-07-18 10:08 |只看该作者
感谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP