博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python排序出现的问题以及解决方案
阅读量:5838 次
发布时间:2019-06-18

本文共 3431 字,大约阅读时间需要 11 分钟。

对某个文件夹中的文件重命名的时候,发现有些文件丢失,代码如下:

#coding=gbk    # Findthe every dir, if 01.rm exist in it, then rename it.  #!/usr/bin/python    ''''' Utilitiesof file & directories. '''    import os import reimport stringimport time  # Get theall files & directories in the specified directory (path).  def get_recursive_file_list(path):      current_files = os.listdir(path)      all_files = []      for file_name in current_files:          full_file_name = os.path.join(path,file_name)          all_files.append(full_file_name)            if os.path.isdir(full_file_name):              next_level_files =get_recursive_file_list(full_file_name)              all_files.extend(next_level_files)        return all_files def need_rename(filename):      if not os.path.isfile(filename):          return False            base_filename = os.path.basename(filename)      pattern = re.compile("^[\d]{1,3}.jpeg$")      if pattern.match(base_filename):          #print base_filename          return True      else:        print "no"        return False    def rename(filename):      old_filename = filename            base_filename = os.path.basename(filename)      dir_name = os.path.dirname(filename)      #print "%s ----------- %s" % (dir_name, base_filename)            #story_name = os.path.basename(dir_name)      #print "story name: ", story_name            #new_filename = os.path.join(dir_name, story_name[3:] + " " + base_filename)    AllName = filename.split('/')[-1]     digit = AllName.split('.')[0]    newDigit = string.atoi(digit)-4    new_filename = dir_name + "/" +str(newDigit)+".jpeg"    #os.rename(old_filename, new_filename)    #os.system("mv "+old_filename +" "+ new_filename)     time.sleep(3)    print "%s ==> %s" % (old_filename, new_filename)  def numeric_compare(x, y):    xAllName = x.split('/')[-1]     xdigit = xAllName.split('.')[0]    yAllName = y.split('/')[-1]     ydigit = yAllName.split('.')[0]    return string.atoi(xdigit) - string.atoi(ydigit)      top_dir = "/mnt/tishare/web/pdf/1125"  all_files = get_recursive_file_list(top_dir)flag=Trueprint(sorted(all_files))#print(sorted(all_files, cmp=numeric_compare))for file in all_files:     if flag:          os.chdir(top_dir)          flag=False     if not need_rename(file):          continue      rename(file)

出错的代码标红,打印出发现其列表为:

['/mnt/tishare/web/pdf/1125/10.jpeg', '/mnt/tishare/web/pdf/1125/11.jpeg', '/mnt/tishare/web/pdf/1125/12.jpeg', '/mnt/tishare/web/pdf/1125/13.jpeg', '/mnt/tishare/web/pdf/1125/14.jpeg', '/mnt/tishare/web/pdf/1125/4.jpeg', '/mnt/tishare/web/pdf/1125/5.jpeg', '/mnt/tishare/web/pdf/1125/6.jpeg', '/mnt/tishare/web/pdf/1125/7.jpeg', '/mnt/tishare/web/pdf/1125/8.jpeg', '/mnt/tishare/web/pdf/1125/9.jpeg']

也就是说其排序有问题,先输出的/mnt/tishare/web/pdf/1125/10.jpeg,其修改为/mnt/tishare/web/pdf/1125/6.jpeg,发现其已经存在,然后造成/mnt/tishare/web/pdf/1125/6.jpeg文件丢失。自定义排序函数,在python2.x中cmp参数指定的函数用来进行元素间的比较。我们在其上自定义numeric_compare排序函数,并使用之,然后就不会出现问题了:

['/mnt/tishare/web/pdf/1125/4.jpeg', '/mnt/tishare/web/pdf/1125/5.jpeg', '/mnt/tishare/web/pdf/1125/6.jpeg', '/mnt/tishare/web/pdf/1125/7.jpeg', '/mnt/tishare/web/pdf/1125/8.jpeg', '/mnt/tishare/web/pdf/1125/9.jpeg','/mnt/tishare/web/pdf/1125/10.jpeg', '/mnt/tishare/web/pdf/1125/11.jpeg', '/mnt/tishare/web/pdf/1125/12.jpeg', '/mnt/tishare/web/pdf/1125/13.jpeg', '/mnt/tishare/web/pdf/1125/14.jpeg']

然后重命名文件就没有问题了。

参考:

http://www.jb51.net/article/57678.htm

http://blog.csdn.net/a_flying_bird/article/details/24116907

你可能感兴趣的文章
关于Cursor的moveToFirst和moveToNext的意义
查看>>
个人--工资划分5份
查看>>
有关文件下载的文件名
查看>>
史上最详细的wamp配置虚拟域名步骤
查看>>
oracle 授权
查看>>
lv扩展磁盘空间
查看>>
java8之stream流的基本操作
查看>>
二维数组计算协方差java
查看>>
SpringBoot下Redis相关配置是如何被初始化的
查看>>
为你的AliOS Things应用增加自定义cli命令
查看>>
Zookeeper
查看>>
MongoDB 创建基础索引、组合索引、唯一索引以及优化
查看>>
百度PaddlePaddle常规赛NLP赛道火热开启
查看>>
稳了!这才是cookie,session与token的真正区别
查看>>
python项目实战:制作一个简易的GUI界面浏览器
查看>>
OSChina 周二乱弹 —— 假期余额已不足!
查看>>
OSChina 周一乱弹 —— 亚洲四大邪术!
查看>>
前端那些事之React篇--helloword
查看>>
swift3.0 常用字符操作 <持续整理>
查看>>
Oracle11g及PL/SQL Developer的安装和配置
查看>>