Python分割文件以及合并文件

本文介绍了一个使用Python编写的文件分割和合并程序。该程序能够将一个大文件分割成多个小文件,并能将这些小文件重新合并为原始文件。程序通过二进制方式读取文件,确保了对任何类型的文件都适用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用Python进行文件操作是比较简单的,在Python中file是内置类型之一,内置的函数open、file都可以创建file对象,创建好之后就可以对其进行读写等操作。

文件分割的原理很简单:以二进制形式打开文件流,按照指定的大小读取,然后写入新文件。
文件合并的原理正好相反。

split_file.py
# !/usr/bin/python
#
#########################################################################
#
 split a file into a set of parts; join.py puts them back together;
#
 this is a customizable version of the standard unix split command-line 
#
 utility; because it is written in Python, it also works on Windows and
#
 can be easily modified; because it exports a function, its logic can 
#
 also be imported and reused in other applications;
#
#########################################################################
     
import  sys, os
kilobytes 
=   1024
megabytes 
=  kilobytes  *   1000
chunksize 
=  int( 1.4   *  megabytes)                    #  default: roughly a floppy
     
def  split(fromfile, todir, chunksize = chunksize): 
    
if   not  os.path.exists(todir):                   #  caller handles errors
        os.mkdir(todir)                             #  make dir, read/write parts
     else :
        
for  fname  in  os.listdir(todir):             #  delete any existing files
            os.remove(os.path.join(todir, fname)) 
    partnum 
=  0
    input 
=  open(fromfile,  ' rb ' )                    #  use binary mode on Windows
     while   1 :                                        #  eof=empty string from read
        chunk  =  input.read(chunksize)               #  get next part <= chunksize
         if   not  chunk:  break
        partnum  
=  partnum + 1
        filename 
=  os.path.join(todir, ( ' part%04d '   %  partnum))
        fileobj  
=  open(filename,  ' wb ' )
        fileobj.write(chunk)
        fileobj.close()                            
#  or simply open().write()
    input.close()
    
assert  partnum  <=   9999                           #  join sort fails if 5 digits
     return  partnum
            
if   __name__   ==   ' __main__ ' :
    
if  len(sys.argv)  ==   2   and  sys.argv[ 1 ==   ' -help ' :
        
print   ' Use: split.py [file-to-split target-dir [chunksize]] '
    
else :
        
if  len(sys.argv)  <   3 :
            interactive 
=   1
            fromfile 
=  raw_input( ' File to be split?  ' )        #  input if clicked 
            todir     =  raw_input( ' Directory to store part files?  ' )
        
else :
            interactive 
=  0
            fromfile, todir 
=  sys.argv[ 1 : 3 ]                   #  args in cmdline
             if  len(sys.argv)  ==   4 : chunksize  =  int(sys.argv[ 3 ])
        absfrom, absto 
=  map(os.path.abspath, [fromfile, todir])
        
print   ' Splitting ' , absfrom,  ' to ' , absto,  ' by ' , chunksize
     
        
try :
            parts 
=  split(fromfile, todir, chunksize)
        
except :
            
print   ' Error during split: '
            
print  sys.exc_info()[0], sys.exc_info()[ 1 ]
        
else :
            
print   ' Split finished: ' , parts,  ' parts are in ' , absto
        
if  interactive: raw_input( ' Press Enter key ' #  pause if clicked

join_file.py

# !/usr/bin/python
#
#########################################################################
#
 join all part files in a dir created by split.py, to recreate file.  
#
 This is roughly like a 'cat fromdir/* > tofile' command on unix, but is 
#
 more portable and configurable, and exports the join operation as a 
#
 reusable function.  Relies on sort order of file names: must be same 
#
 length.  Could extend split/join to popup Tkinter file selectors.
#
#########################################################################
     
import  os, sys
readsize 
=   1024
     
def  join(fromdir, tofile):
    output 
=  open(tofile,  ' wb ' )
    parts  
=  os.listdir(fromdir)
    parts.sort()
    
for  filename  in  parts:
        filepath 
=  os.path.join(fromdir, filename)
        fileobj  
=  open(filepath,  ' rb ' )
        
while   1 :
            filebytes 
=  fileobj.read(readsize)
            
if   not  filebytes:  break
            output.write(filebytes)
        fileobj.close()
    output.close()
     
if   __name__   ==   ' __main__ ' :
    
if  len(sys.argv)  ==   2   and  sys.argv[ 1 ==   ' -help ' :
        
print   ' Use: join.py [from-dir-name to-file-name] '
    
else :
        
if  len(sys.argv)  !=   3 :
            interactive 
=   1
            fromdir 
=  raw_input( ' Directory containing part files?  ' )
            tofile  
=  raw_input( ' Name of file to be recreated?  ' )
        
else :
            interactive 
=  0
            fromdir, tofile 
=  sys.argv[ 1 :]
        absfrom, absto 
=  map(os.path.abspath, [fromdir, tofile])
        
print   ' Joining ' , absfrom,  ' to make ' , absto
     
        
try :
            join(fromdir, tofile)
        
except :
            
print   ' Error joining files: '
            
print  sys.exc_info()[0], sys.exc_info()[ 1 ]
        
else :
           
print   ' Join complete: see ' , absto
        
if  interactive: raw_input( ' Press Enter key ' #  pause if clicked

以上代码在window下面测试成功,可以分割文件文件已经任何二进制文件。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值