04文件分割器脚本

 1 '''
 2 将文件分割成很多组分,join.py将它们合并回
 3 '''
 4 
 5 import sys,os
 6 
 7 kilobytes=1024
 8 megabytes=kilobytes*1000
 9 chunksize=int(1.4*megabytes)    #默认设置,大约一个软盘的容量
10 
11 def split(fromfile,todir,chunksize=chunksize):
12     if not os.path.exists(todir):
13         os.mkdir(todir)
14     else:
15         for fname in os.listdir(todir):
16             os.remove(os.path.join(todir,fname))
17     partnum=0
18     file_open=open(fromfile, 'rb')   #二进制模式:不解码,没有行尾
19     while True:
20         chunk=file_open.read(chunksize) #获取下一个组分文件
21         if not chunk:break
22         partnum+=1
23         filename=os.path.join(todir,('part%04d'%partnum))
24         fileobj=open(filename,'wb')
25         fileobj.write(chunk)
26         fileobj.close()
27     file_open.close()
28     assert partnum<=9999
29     return partnum
30 
31 if __name__ == '__main__':
32     if len(sys.argv)==2 and sys.argv[1]=='-help':
33         print('Use:split.py [file-to-split target-dir [chunksize]]')
34     else:
35         if len(sys.argv)<3:
36             interactive=True
37             fromfile=input('File to be split?')
38             todir=input('Directory to store part files?')
39         else:
40             interactive=False
41             fromfile,todir=sys.argv[1:3]
42             if len(sys.argv)==4:chunksize=int(sys.argv[3])#如果传入第3个参数,则令此参数为分割的大小
43         absfrom,absto=map(os.path.abspath,[fromfile,todir])
44         print('Splitting',absfrom,'to',absto,'by','chunksize')
45 
46         try:
47             parts=split(fromfile,todir,chunksize)
48         except:
49             print('Error during split:')
50             print(sys.exc_info()[0],sys.exc_info()[1])
51         else:
52             print('Split finished:',parts,'parts are in ',absto)
53         if interactive:input('Press Enter key')

 

  通过检查命令行参数的数目来判断其使用模式。在命令行模式下,你在命令行中列出待分割的文件和输出目录,还可以选择性的利用第三个命令行参数重写默认的组分文件大小。

  在交互模式下,脚本通过input在控制台窗口询问文件名和输出目录,并在结束时暂停,等待键盘输入后退出。

  这段代码谨慎地在二进制(rb,wb)下打开输入及输出文件,因为它需要可移植地处理可执行文件和音频文件等,而不仅是处理文本。

  这个脚本还特意手动关闭文件。以前我们使用一行代码就足够了:open(partname,'wb').write(chunk)  这种简化的形式依赖于一个事实,即python在对象被回收时(即文件对象由于不再有引用而被垃圾回收时)自动关闭文件。在这行单行代码中,文件对象可能马上就被回收了,因为open的结果临时存在于一个表达式中,并从未被长时存在的名称引用过。

原文地址:https://www.cnblogs.com/start20180703/p/10329069.html