python文件排序的方法总结


Posted in Python onSeptember 13, 2020

在python环境中提供两种排序方案:用库函数sorted()对字符串排序,它的对象是字符;用函数sort()对数字排序,它的对象是数字,如果读取文件的话,需要进行处理(把文件后缀名‘屏蔽')。

(1)首先:我测试的文件夹是/img/,里面的文件都是图片,如下图所示:

python文件排序的方法总结

(2)测试库函数sorted(),直接贴出代码:

import numpy as np
import os
 
img_path='./img/'
 
img_list=sorted(os.listdir(img_path))#文件名按字母排序
img_nums=len(img_list)
for i in range(img_nums):
    img_name=img_path+img_list[i]
    print(img_name)

运行效果如下:

python文件排序的方法总结

从图片可以清晰的看出,文件名是按字符排序的。

(3)测试函数sort(),代码:

import numpy as np
import os
img_path='./img/'
 
img_list=os.listdir(img_path)
img_list.sort()
img_list.sort(key = lambda x: int(x[:-4])) ##文件名按数字排序
img_nums=len(img_list)
for i in range(img_nums):
    img_name=img_path+img_list[i]
    print(img_name)

运行效果如下:

python文件排序的方法总结

可以看出,文件名是按数字排序的;顺便提下,sort函数中用到了匿名函数(key = lambda x:int(x[:-4])),其作用是将后缀名'.jpg'“屏蔽”(因为‘.jpg'是4个字符,所以[:-4]的含义是从文件名开始到倒数第四个字符为止),具体看python的匿名函数和数组取值方式。

实例扩展:

import gzip
import os
from multiprocessing import Process, Queue, Pipe, current_process, freeze_support
from datetime import datetime
def sort_worker(input,output):
 while True:
 lines = input.get().splitlines()
 element_set = {}
 for line in lines:
  if line.strip() == 'STOP':
   return
  try:
   element = line.split(' ')[0]
   if not element_set.get(element): element_set[element] = ''
  except:
   pass
 sorted_element = sorted(element_set)
 #print sorted_element
 output.put('\n'.join(sorted_element))
def write_worker(input, pre):
 os.system('mkdir %s'%pre)
 i = 0
 while True:
  content = input.get()
  if content.strip() == 'STOP':
   return
  write_sorted_bulk(content, '%s/%s'%(pre, i))
  i += 1
def write_sorted_bulk(content, filename):
 f = file(filename, 'w')
 f.write(content)
 f.close()
def split_sort_file(filename, num_sort = 3, buf_size = 65536*64*4):
 t = datetime.now()
 pre, ext = os.path.splitext(filename)
 if ext == '.gz':
  file_file = gzip.open(filename, 'rb')
 else:
  file_file = open(filename)
 bulk_queue = Queue(10)
 sorted_queue = Queue(10)
 NUM_SORT = num_sort
 sort_worker_pool = []
 for i in range(NUM_SORT):
  sort_worker_pool.append( Process(target=sort_worker, args=(bulk_queue, sorted_queue)) )
  sort_worker_pool[i].start()
 NUM_WRITE = 1
 write_worker_pool = []
 for i in range(NUM_WRITE):
  write_worker_pool.append( Process(target=write_worker, args=(sorted_queue, pre)) )
  write_worker_pool[i].start()
 buf = file_file.read(buf_size)
 sorted_count = 0
 while len(buf):
  end_line = buf.rfind('\n')
  #print buf[:end_line+1]
  bulk_queue.put(buf[:end_line+1])
  sorted_count += 1
  if end_line != -1:
   buf = buf[end_line+1:] + file_file.read(buf_size)
  else:
   buf = file_file.read(buf_size)
 for i in range(NUM_SORT):
  bulk_queue.put('STOP')
 for i in range(NUM_SORT):
  sort_worker_pool[i].join()
  
 for i in range(NUM_WRITE):
  sorted_queue.put('STOP')
 for i in range(NUM_WRITE):
  write_worker_pool[i].join()
 print 'elasped ', datetime.now() - t
 return sorted_count
from heapq import heappush, heappop
from datetime import datetime
from multiprocessing import Process, Queue, Pipe, current_process, freeze_support
import os
class file_heap:
 def __init__(self, dir, idx = 0, count = 1):
  files = os.listdir(dir)
  self.heap = []
  self.files = {}
  self.bulks = {}
  self.pre_element = None
  for i in range(len(files)):
   file = files[i]
   if hash(file) % count != idx: continue
   input = open(os.path.join(dir, file))
   self.files[i] = input
   self.bulks[i] = ''
   heappush(self.heap, (self.get_next_element_buffered(i), i))
 def get_next_element_buffered(self, i):
  if len(self.bulks[i]) < 256:
   if self.files[i] is not None:
    buf = self.files[i].read(65536)
    if buf:
     self.bulks[i] += buf
    else:
     self.files[i].close()
     self.files[i] = None
  end_line = self.bulks[i].find('\n')
  if end_line == -1:
   end_line = len(self.bulks[i])
  element = self.bulks[i][:end_line]
  self.bulks[i] = self.bulks[i][end_line+1:]
  return element
 def poppush_uniq(self):
  while True:
   element = self.poppush()
   if element is None:
    return None
   if element != self.pre_element:
    self.pre_element = element
    return element
 def poppush(self):
  try:
   element, index = heappop(self.heap)
  except IndexError:
   return None
  new_element = self.get_next_element_buffered(index)
  if new_element:
   heappush(self.heap, (new_element, index))
  return element
def heappoppush(dir, queue, idx = 0, count = 1):
 heap = file_heap(dir, idx, count)
 while True:
  d = heap.poppush_uniq()
  queue.put(d)
  if d is None: return
def heappoppush2(dir, queue, count = 1):
 heap = []
 procs = []
 queues = []
 pre_element = None
 for i in range(count):
  q = Queue(1024)
  q_buf = queue_buffer(q)
  queues.append(q_buf)
  p = Process(target=heappoppush, args=(dir, q_buf, i, count))
  procs.append(p)
  p.start()
 queues = tuple(queues)
 for i in range(count):
  heappush(heap, (queues[i].get(), i))
 while True:
  try:
   d, i= heappop(heap)
  except IndexError:
   queue.put(None)
   for p in procs:
    p.join()
   return
  else:
   if d is not None:
    heappush(heap,(queues[i].get(), i))
    if d != pre_element:
     pre_element = d
     queue.put(d)
def merge_file(dir):
 heap = file_heap( dir )
 os.system('rm -f '+dir+'.merge')
 fmerge = open(dir+'.merge', 'a')
 element = heap.poppush_uniq()
 fmerge.write(element+'\n')
 while element is not None:
  element = heap.poppush_uniq()
  fmerge.write(element+'\n')
class queue_buffer:
 def __init__(self, queue):
  self.q = queue
  self.rbuf = []
  self.wbuf = []
 def get(self):
  if len(self.rbuf) == 0:
   self.rbuf = self.q.get()
  r = self.rbuf[0]
  del self.rbuf[0]
  return r
 def put(self, d):
  self.wbuf.append(d)
  if d is None or len(self.wbuf) > 1024:
   self.q.put(self.wbuf)
   self.wbuf = []
def diff_file(file_old, file_new, file_diff, buf = 268435456):
 print 'buffer size', buf
 from file_split import split_sort_file
 os.system('rm -rf '+ os.path.splitext(file_old)[0] )
 os.system('rm -rf '+ os.path.splitext(file_new)[0] )
 t = datetime.now()
 split_sort_file(file_old,5,buf)
 split_sort_file(file_new,5,buf)
 print 'split elasped ', datetime.now() - t
 os.system('cat %s/* | wc -l'%os.path.splitext(file_old)[0])
 os.system('cat %s/* | wc -l'%os.path.splitext(file_new)[0])
 os.system('rm -f '+file_diff)
 t = datetime.now()
 zdiff = open(file_diff, 'a')
 old_q = Queue(1024)
 new_q = Queue(1024)
 old_queue = queue_buffer(old_q)
 new_queue = queue_buffer(new_q)
 h1 = Process(target=heappoppush2, args=(os.path.splitext(file_old)[0], old_queue, 3))
 h2 = Process(target=heappoppush2, args=(os.path.splitext(file_new)[0], new_queue, 3))
 h1.start(), h2.start()
 old = old_queue.get()
 new = new_queue.get()
 old_count, new_count = 0, 0
 while old is not None or new is not None:
  if old > new or old is None:
   zdiff.write('< '+new+'\n')
   new = new_queue.get()
   new_count +=1
  elif old < new or new is None:
   zdiff.write('> '+old+'\n')
   old = old_queue.get()
   old_count +=1
  else:
   old = old_queue.get()
   new = new_queue.get()
 print 'new_count:', new_count
 print 'old_count:', old_count
 print 'diff elasped ', datetime.now() - t
 h1.join(), h2.join()

到此这篇关于python文件排序的方法总结的文章就介绍到这了,更多相关python文件排序都有哪些方法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python获取运行目录与当前脚本目录的方法
Jun 01 Python
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
python SVM 线性分类模型的实现
Jul 19 Python
python实现的发邮件功能示例
Sep 11 Python
python实现拼接图片
Mar 23 Python
pyCharm 实现关闭代码检查
Jun 09 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
Python使用protobuf序列化和反序列化的实现
May 19 Python
python识别验证码的思路及解决方案
Sep 13 #Python
Python实现敏感词过滤的4种方法
Sep 12 #Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 #Python
python 如何利用argparse解析命令行参数
Sep 11 #Python
Python Pivot table透视表使用方法解析
Sep 11 #Python
Python extract及contains方法代码实例
Sep 11 #Python
python 利用zmail库发送邮件
Sep 11 #Python
You might like
PHP中overload与override的区别
2017/02/13 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
Python 错误和异常小结
2013/10/09 Python
在Python中使用Neo4j数据库的教程
2015/04/16 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
python中int与str互转方法
2018/07/02 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
python的移位操作实现详解
2019/08/21 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
pytorch实现查看当前学习率
2020/06/24 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
活动总结报告怎么写
2014/07/03 职场文书
学术会议通知
2015/04/15 职场文书
烈士陵园扫墓感想
2015/08/07 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
干部理论学习心得体会
2016/01/21 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL