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
相关资源:windows 大文本文件分割器