`
bcyy
  • 浏览: 1827395 次
文章分类
社区版块
存档分类
最新评论

Python实现简单的打包

 
阅读更多

版权所有,转载请注明出处:http://guangboo.org/2013/03/14/package-with-python-implement

通常我们在对目录进行打包时都是有zip或rar工具,然而现在就遇到一个问题。我可以通过zip来对目录进行打包,但是我没有办法将这样一个文件上传到服务器(内网受限),只能上传图标格式,或文本格式。由于我目录下也都是文本文件,所有这里就想到一个变通的办法,将目录层次结构和文件的内容都存到一个文本文件里面,然后上传。

文本文件的格式也只需要稍作规定,第一行为“打包”目录的根目录,第二行开始为目录名字,文件名,然后是文件内容。格式如下啊:

source file root directory
>>> [direcotry1]
>>> [direcotry2]
>>> filename1
file content..................................................
......................................
>>> filename2
file content..................................................
......................................

这样的格式,我们就可以对其解析,并还原到磁盘。那么实现“打包”的过程,使用python来实现,如下:

# -*- coding:utf-8 -*-
import os
import sys
import codecs

def compress(src_dir, target_file):
      output = codecs.open(target_file, 'w', 'utf-8')
      # write root
      print >> output, src_dir
      
      for _dir, sub_dirs, files in os.walk(src_dir):
            for sub_dir in sub_dirs:
                  print >> output, u'\n>>> [%s%s%s]' % (_dir, os.sep, sub_dir)
                  print >> sys.stdout, u'>>> [%s%s%s]' % (_dir, os.sep, sub_dir)
            for filename in files:
                  if os.path.splitext(filename)[-1] in ['.txt', '.css', '.js', '.html', '.htm', '.py']:
                        src_file = '%s%s%s' % (_dir, os.sep, filename)
                        print >> sys.stdout, '>>> ', src_file
                        tf = codecs.open(src_file, 'r', 'utf-8')
                        print >> output, u'\n>>> %s' % src_file
                        for line in tf.readlines():
                              output.write(u'%s' % line)
      output.close()

代码中使用codecs.open方法,主要是可以通过utf-8编码方式来打开文件,并使用os.walk来遍历跟目录src_dir下所有子目录和文件。那么只需要简单调用该方法,传递要“打包”的目录地址,和要“打包”成的文件名即可,如:

compress('c:\\project', 'c:\\project.txt')

这样“打包”过程,便完成了,但是有了打包过程,必定要有“解包”的过程,既然我们知道“打包”后的文件格式,那么也就很容易将文件的内容重新还原到磁盘上,代码如下:

def decompress(src_file, target_dir):
      import re
      input = open(src_file, 'r')
      root = input.readline()
      cut_len = len(root)
      line = input.readline()
      dir_reg = re.compile('\[(.+)\]')
      filename_reg = re.compile('^>>> (.+)$')
      target_file = None
      
      while line:
            if line.startswith('>>> ['):
                  if target_file:
                        target_file.close()
                        target_file = None
                  txt = dir_reg.findall(line)
                  if txt:
                        dir_handler(txt[0][cut_len:], target_dir)
            elif line.startswith('>>>'):
                  if target_file:
                        target_file.close()
                        target_file = None
                  txt = filename_reg.findall(line)
                  if txt:
                        fn = os.path.join(target_dir, txt[0][cut_len:])
                        target_file = open(fn, 'w')
                        print >> sys.stdout, 'file:%s' % fn
            elif target_file:
                  target_file.write(line)
                  
            line = input.readline()
            
      if target_file:
            target_file.close()
      input.close()

def dir_handler(txt, target_dir):
      _dir = os.path.join(target_dir, txt)
      try:
            os.mkdir(_dir)
            print >> sys.stdout, 'dir:%s' % _dir
      except IOError:
            print '>>> Directory %s created failed.' % _dir

该方法是用正则表达来判断“包”文件的行,是目录还是文件,或者是文件内容。并可以还原目录结构。进行还原时,需要调用decompress方法,传递包文件名称,和存放目录。如:

decompress('c:\\project.txt', 'c:\\project2', )

那么为了方便,我们将两个方法定义到同一文件zip.py中,并添加如下代码,使得可以在命令行中传递参数,实现“打包”和“解包”功能:

if __name__ == '__main__':
      cmd = sys.argv[1]
      src = sys.argv[2]
      target = sys.argv[3]

      if cmd == 'compress':
            compress(src, target)
      elif cmd == 'decompress':
            decompress(src, target)

那么“打包”和“解包”的过程,就可以通过如下命令来实现:

zip.py compress c:\project c:\package.txt

zip.py decompress c:\package.txt c:\project2

下载文件:zip.py

分享到:
评论

相关推荐

    用Python实现的图片打包和浏览程序

    用Python、PIL和Tkinter写的小软件,代码很短,功能很简单,供学习Python、PIL和Tkinter的朋友参考用。 包含图片文件的目录被称为“图片包”目录。packTPB.py把一个大目录下面的所有“图片包”目录都打包成一个单一...

    用python 实现2D不规则打包算法_C++_python代码_下载

    包含用于 2D 不规则打包的算法和算法的简单教程 算法 Bottom-Left-Fill.py:嵌套问题的 2-exchange 启发式 2002 genetic_algorithm.py:嵌套问题的 2 交换启发式算法 2002 nfp_test.py:针对不规则切削问题的完整...

    python 利用Pyinstaller打包Web项目

    1.如果是单文件项目,pyinstaller可以通过简单的命令进行python代码的打包工作,其命令为: pyinstaller -option ***.py  1.1参数option可以有多个值:  -F : 指定打包后只生成一个exe格式的文件  

    基于python实现json数据的打包及解析简单实例

    使用内置的json模块来轻松地将数据打包成JSON格式,通过一个简单的示例,展示了如何将Python中的字典、列表等数据结构转换为JSON格式的字符串。

    植物大战僵尸python源码打包

    利用Python实现的植物大战僵尸的简易游戏源码,可供python游戏开发学习使用,运行只需安装pygame库即可正常执行与运行,是学习游戏制作的优秀代码。

    python tkinter实现的简单计算器.py

    使用Python的tkinter实现的最简单的计算器 使用python版本为2.7.14,64bit 可安装pyinstaller后将该源码进行打包成exe后直接在其他机器上运行 本脚本只实现基础功能

    docker python如何实现打包的方法

    最近用Python写了一段爬虫程序,为了隔离其运行环境,易于分发,把项目打包成Docker镜像 Dockerfile FROM python:2.7.12-alpine ADD ./src /job CMD [python, /job/main.py] 构建命令 $ docker build -t job . ...

    PythonTool多渠道打包

    PythonTool多渠道打包工具,可简单的操作实现打包,快速简单,比友盟 简单操作。

    基于python实现高德地图+58租房在地图上展示房源位置信息源码

    基于python实现高德地图+58租房在地图上展示房源位置信息源码 在PyCharm中运行《高德地图+58租房》即可进入如图1所示的高德地图网页。 具体的操作步骤如下: (1)打开地图网页后,在编辑框中输入工作地点,将...

    大一python基础编程题水果-教程简单教程:用Python解决简单的水果分类问题....pdf

    在这篇⽂章中,我们将使⽤Python中最流⾏的机器学习⼯具scikit- learn,在Python中实现⼏种机器学习算法。使⽤简单的数据集来训练分 类器区分不同类型的⽔果。这篇⽂章的⽬的是识别出最适合当前问题的机器学习算法。...

    基于python实现火车票分析助手展示车票信息脚本源码实现

    基于python实现火车票分析助手展示车票信息脚本源码实现 在PyCharm中运行《火车票分析助手》即可进入如图1所示的系统主界面。 具体的操作步骤如下: (1)在主界面“车票查询”选项卡中依次输入,出发地、目的地...

    基于python实现火车票分析助手展示车票信息脚本源码实现分享

    基于python实现火车票分析助手展示车票信息脚本源码实现 在PyCharm中运行《火车票分析助手》即可进入如图1所示的系统主界面。 具体的操作步骤如下: (1)在主界面“车票查询”选项卡中依次输入,出发地、目的地...

    基于python实现超级画板桌面应用画图程序源码

    基于python实现超级画板桌面应用画图程序源码 在PyCharm中运行超级画板即可进入如图1所示的系统主界面。在该界面中,通过左侧的工具栏可以选择所要进行的操作。 具体的操作步骤如下: 超级画板的主要功能都集中在...

    演示如何使用Python和PyLoRa库在LoRa设备之间进行通信

    下面是一个更详细的代码示例,展示了如何使用Python和PyLoRa库在两个LoRa设备之间进行简单的双向通信: 代码中,发送端将一个浮点数值(3.14)打包为二进制数据,并通过LoRa通信socket发送。接收端从LoRa通信socket...

    基于python实现超级画板桌面应用画图程序源码分享

    基于python实现超级画板桌面应用画图程序源码 在PyCharm中运行超级画板即可进入如图1所示的系统主界面。在该界面中,通过左侧的工具栏可以选择所要进行的操作。 具体的操作步骤如下: 超级画板的主要功能都集中在...

    基于python实现五子棋(控制台版)源代码

    基于python实现五子棋(控制台版)源代码 Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。且...

    基于python实现五子棋(控制台版)源码分享

    基于python实现五子棋(控制台版)源代码 Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。且...

    基于python实现玛丽冒险闯关小游戏源码

    基于python实现玛丽冒险闯关小游戏源码 Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单 在PyCharm中运行《玛丽冒险》即可进入如图1所示的游戏主界面。 具体的操作步骤如下: (1)...

    基于python实现玛丽冒险闯关小游戏源码分享

    基于python实现玛丽冒险闯关小游戏源码 Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单 在PyCharm中运行《玛丽冒险》即可进入如图1所示的游戏主界面。 具体的操作步骤如下: (1)...

    Swirld 拜占庭共识算法的Python实现_python_代码_下载

    实现非常简单:代码被划分为与论文中相同的函数: 主循环(这是一个协程,用于启用逐步评估并避免线程)。 sync(, )它查询远程节点并更新本地数据。 divide_rounds它为新交易设置了整数和见证。 decide_fame它负责...

Global site tag (gtag.js) - Google Analytics