设为首页 收藏本站
查看: 1340|回复: 0

[经验分享] python学习——大文件分割与合并

[复制链接]

尚未签到

发表于 2015-4-20 11:10:41 | 显示全部楼层 |阅读模式
  在平常的生活中,我们会遇到下面这样的情况:
  你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他。
  然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情况),假设现在只有一个2G或4G的优盘,该怎么办呢?
  有很多方法,例如winrar压缩的时候分成很多小卷,这里不累述。
  在学习python之后,我们自己就可以解决这个问题啦。
  我们可以自己写一个脚本去分割合并文件,将文件分割成适合优盘大小的小文件,在拷贝,然后再合并。
  
  下面是文件分割脚本:



1 import sys,os
2
3 kilobytes = 1024
4 megabytes = kilobytes*1000
5 chunksize = int(200*megabytes)#default chunksize
6
7 def split(fromfile,todir,chunksize=chunksize):
8     if not os.path.exists(todir):#check whether todir exists or not
9         os.mkdir(todir)         
10     else:
11         for fname in os.listdir(todir):
12             os.remove(os.path.join(todir,fname))
13     partnum = 0
14     inputfile = open(fromfile,'rb')#open the fromfile
15     while True:
16         chunk = inputfile.read(chunksize)
17         if not chunk:             #check the chunk is empty
18             break
19         partnum += 1
20         filename = os.path.join(todir,('part%04d'%partnum))
21         fileobj = open(filename,'wb')#make partfile
22         fileobj.write(chunk)         #write data into partfile
23         fileobj.close()
24     return partnum
25 if __name__=='__main__':
26         fromfile  = input('File to be split?')
27         todir     = input('Directory to store part files?')
28         chunksize = int(input('Chunksize to be split?'))
29         absfrom,absto = map(os.path.abspath,[fromfile,todir])
30         print('Splitting',absfrom,'to',absto,'by',chunksize)
31         try:
32             parts = split(fromfile,todir,chunksize)
33         except:
34             print('Error during split:')
35             print(sys.exc_info()[0],sys.exc_info()[1])
36         else:
37             print('split finished:',parts,'parts are in',absto)
  下面是脚本运行的例子:
  我们在F有一个X—MEN1.rar文件,1.26G大小,我们现在把它分割成400000000bit(大约380M)的文件。



Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
File to be split?F:\X-MEN1.rar
Directory to store part files?F:\split
Chunksize to be split?400000000
Splitting F:\X-MEN1.rar to F:\split by 400000000
split finished: 4 parts are in F:\split
>>>
  这是分割后的文件:
DSC0000.png
  
  下面是文件合并脚本:
  



1 import sys,os
2
3 def joinfile(fromdir,filename,todir):
4     if not os.path.exists(todir):
5         os.mkdir(todir)
6     if not os.path.exists(fromdir):
7         print('Wrong directory')
8     outfile = open(os.path.join(todir,filename),'wb')
9     files = os.listdir(fromdir) #list all the part files in the directory
10     files.sort()                #sort part files to read in order
11     for file in files:
12         filepath = os.path.join(fromdir,file)
13         infile = open(filepath,'rb')
14         data = infile.read()
15         outfile.write(data)
16         infile.close()
17     outfile.close()
18 if __name__=='__main__':
19         fromdir = input('Directory containing part files?')
20         filename = input('Name of file to be recreated?')
21         todir   = input('Directory to store recreated file?')
22         
23         try:
24             joinfile(fromdir,filename,todir)
25         except:
26             print('Error joining files:')
27             print(sys.exc_info()[0],sys.exc_info()[1])
  运行合并脚本,将上面分割脚本分割的文件重组:



Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Directory containing part files?F:\split
Name of file to be recreated?xman1.rar
Directory to store recreated file?F:\
>>>
  运行之后可以看到F盘下生成了重组的xman.rar

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58751-1-1.html 上篇帖子: VS2013中Python学习笔记[Django Web的第一个网页] 下篇帖子: Python基础:新式类的属性访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表