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验证码识别的实例详解
Sep 09 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
Dec 18 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
对django layer弹窗组件的使用详解
Aug 31 Python
python入门之基础语法学习笔记
Feb 08 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
Python openpyxl模块实现excel读写操作
Jun 30 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
python3.7调试的实例方法
Jul 21 Python
python百行代码实现汉服圈图片爬取
Nov 23 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设计模式中单例模式的应用分析
2013/05/15 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
学习jquery之一
2007/04/27 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
基于javascript实现样式清新图片轮播特效
2016/03/30 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
javascript实现时钟动画
2020/12/03 Javascript
python实现发送邮件功能
2017/07/22 Python
基于python中theano库的线性回归
2018/08/31 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
pandas删除指定行详解
2019/04/04 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
考试违纪检讨书
2014/02/02 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
教师评语大全
2014/04/28 职场文书
成本会计实训报告
2014/11/05 职场文书
春风化雨观后感
2015/06/11 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
java调用Restful接口的三种方法
2021/08/23 Java/Android
Mysql忘记密码解决方法
2022/02/12 MySQL