下面是小编为大家整理的RC4文件加密的python实现方法(共含6篇),供大家参考借鉴,希望可以帮助到有需要的朋友。同时,但愿您也能像本文投稿人“鲜鲜隐形眼镜”一样,积极向本站投稿分享好文章。
作者:1Byte 字体:[增加 减小] 类型:
这篇文章主要介绍了RC4文件加密的python实现方法,实例分析了RC4文件加密的原理与Python实现技巧,需要的朋友可以参考下
本文实例讲述了RC4文件加密的python实现方法,分享给大家供大家参考。具体分析如下:
基于RC4流加密算法,使用扩展的16*16的S盒,32字节密钥。
目前应该是比较安全的。
刚学习python,好不容易调通了。
而且在VC和python下各实现了一遍,两个平台能够互相加解密,很有成就感的说。
下面是python3.0中的实现,在2.x下需要稍加修改。
# for python 3.0# from 李勃import struct,sys,os,binascii“”“ RC4加密算法 16*16 S盒 加密单元:short”“”def RC4(pkey,keylen,pin,dlen): N=65536 S = list(range(N)) j = 0 for i in range(N): j = (j + S[i] + pkey[i%keylen])%N temp = S[i] S[i] = S[j] S[j] = temp i = j = 0 pout= b‘‘ for x in range(dlen): i = i+1 j = (j + S[i])%N temp = S[i] S[i] = S[j] S[j] = temp pout += struct.pack(‘H‘,pin[x]^S[(S[i]+S[j])%N]) return(pout)# bytes->shortdef Coding(data): if(len(data)%2): data+=b‘\0‘ dlen = len(data)//2 return(struct.unpack(str(dlen)+‘H‘,data))# short->bytesdef unCoding(data): d=b‘‘ for i in range(len(data)): d += struct.pack(‘H‘,data[i]) return(d)#产生32字节密钥def CreatKey(Keyt): pl = len(Keyt) Key=b‘‘ r=0 for i in range(32): k=(Keyt[r%pl]+i)%256 Key+= struct.pack(‘B‘,k) r+=1 return Key#更新密钥def UpdataKey(Keyt): Key = unCoding(Keyt) #循环左移 Key = Key[1:] + struct.pack(‘B‘,Key[0]) tem=0 #求和 for i in range(len(Key)): tem += Key[i]; Keyo=b‘‘ #Xor for i in range(len(Key)): Keyo += struct.pack(‘B‘,(Key[i]^tem)%256) tem += Keyo[i]>>3 tem = tem % 256 return(Coding(Keyo))if __name__ == ‘__main__‘: #获得输入文件 if len(sys.argv)==1: filename = input(‘源文件: ‘) else: filename = sys.argv[1] try: fin = open(filename,‘rb‘) except: print(‘打开文件失败!‘) input sys.exit() print(filename) #打开输出文件 if filename[-4:]==‘.RC4‘: eID = 1 key=input(‘输入解密密钥: ‘).encode() filename = filename[:-4] else: eID = 2 key=input(‘输入加密密钥: ‘).encode() filename = filename+‘.RC4‘ key = Coding(CreatKey(key)) key = UpdataKey(key) #处理重名 while os.path.exists(ofilename): filename = os.path.dirname(ofilename)+ ‘\\副本 ‘+ os.path.basename(ofilename) fout = open(ofilename,‘wb‘) print(ofilename) #解密 if eID==1: #读文件长度 filelen = struct.unpack(‘I‘,fin.read(4))[0] print(‘FlieLen =‘,filelen,‘\n......‘) while 1:#读块大小ps= fin.read(2)if not ps: #文件结束 breakpacksize = struct.unpack(‘H‘,ps)[0]#读数据dd=fin.read(packsize)#解密dd=Coding(dd)x = RC4(key,len(key),dd,len(dd))key = UpdataKey(key)#crccrc = struct.unpack(‘I‘,fin.read(4))[0]if binascii.crc32(x)!=crc: print(‘CRC32校验错误!‘,crc,binascii.crc32(x)) input() sys.exit()fout.write(x) #裁剪末尾填充位 fout.truncate(filelen) #加密 elif eID==2: #获得文件长度 fin.seek(0,2) filelen = fin.tell() print(‘FlieLen =‘,filelen,‘\n......‘) fin.seek(0,0) fout.write(struct.pack(‘I‘,filelen)) while 1:#读数据dd=fin.read(65534)if not dd: #文件结束 break#末尾填充srl = len(dd)if srl%2: srl+=1; dd+=b‘\0‘#crccrc = struct.pack(‘I‘,binascii.crc32(dd))#加密数据dd=Coding(dd)x = RC4(key,len(key),dd,len(dd))key = UpdataKey(key)#写入文件fout.write(struct.pack(‘H‘,srl))fout.write(x)fout.write(crc) fin.close() fout.close() print(‘OK!‘) input()
希望本文所述对大家的Python程序设计有所帮助,
作者:秋风秋雨 字体:[增加 减小] 类型:转载
这篇文章主要介绍了python实现文件快照加密保护的方法,涉及Python文件加密的技巧,可有效防止文件被篡改,需要的朋友可以参考下
本文实例讲述了python实现文件快照加密保护的方法,分享给大家供大家参考。具体如下:
这段代码可以对指定的目录进行扫描,包含子目录,对指定扩展名的文件进行SHA-1加密后存储在cvs文件,以防止文件被篡改
调用方法:python snapper.py >todayCheck.csv
# Hello, this is a script. written in Python. See www.pyhon.org## Snapper 1.2p## This script. will walk a directory (and its subdirectories) and compute# SHA (Secure Hash Algorithm) for specific files (according to their# extensions) and ouput a CSV file (suited for loading into a spreadsheet# editor,a database or simply comparing with diff or ExamDiff.).## You can redirect the output of this script. to a file.# eg. python snapper.py >todayCheck.csv## This script. can be usefull to check system files tampering.## This script. is public domain. Feel free to reuse it.# The author is:# Sebastien SAUVAGE# 希望本文所述对大家的Python程序设计有所帮助, Python 初始化多维数组代码 python 图片验证码代码分享 Python中的并发编程实例 Python爬虫框架Scrapy安装使用步骤 python实现代码行数统计示例分享 python 测试实现方法 python re正则表达式模块(Regular Expres python 中文字符串的处理实现代码 python 获取本机ip地址的两个方法 Cython 三分钟入门教程 Python入门教程 超详细1小时学会 python 中文乱码问题深入分析 比较详细Python正则表达式操作指 Python字符串的encode与decode研 Python open读写文件实现脚本 Python enumerate遍历数组示例应 Python 深入理解yield Python+Django在windows下的开发 python 字符串split的用法分享 python 文件和路径操作函数小结 作者:liupengs 字体:[增加 减小] 类型: 这篇文章主要介绍了python实现DES加密解密方法,以实例形式较为详细的分析了基于Python实现的DES加密与解密技巧,需要的朋友可以参考下 本文实例讲述了python实现DES加密解密方法,分享给大家供大家参考。具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优化 1. desstruct.py DES加密中要使用的结构体 ip= (58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9 , 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7)ip_1=(40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25)e =(32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12,13, 12, 13, 14, 15, 16, 17, 16,17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1)p=(16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25)s=[ [[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7], [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8], [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0], [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]], [[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10], [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5], [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15], [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]], [[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8], [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1], [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7], [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]], [[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15], [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14,9], [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4], [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]], [[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9], [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6], [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14], [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]], [[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11], [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8], [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6], [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]], [[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1], [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6], [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2], [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]], [[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7], [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2], [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8], [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]]]pc1=(57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 33, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4);pc2= (14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32)d = ( 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1) 2. des.py 加密文件 #_*_ coding:utf-8 _*_#!/usr/bin/env python#Filename:des.pyfrom desstruct import *import re__all__=[‘desencode‘]class DES: ‘‘‘des 加密‘‘‘ def __init__(self): pass #加密 def code(self,from_code,key,code_len,key_len): utput=“” trun_len=0 #将密文和密钥转换为二进制 code_string=self._functionCharToA(from_code,code_len) code_key=self._functionCharToA(key,key_len) #如果密钥长度不是16的整数倍则以增加0的方式变为16的整数倍 if code_len%16!=0:real_len=(code_len/16)*16+16 else:real_len=code_len if key_len%16!=0:key_len=(key_len/16)*16+16 key_len*=4 #每个16进制占4位 trun_len=4*real_len #对每64位进行一次加密 for i in range(0,trun_len,64):run_code=code_string[i:i+64]l=i%key_lenrun_key=code_key[l:l+64]#64位明文、密钥初始置换run_code= self._codefirstchange(run_code)run_key= self._keyfirstchange(run_key)#16次迭代for j in range(16): #取出明文左右32位 code_r=run_code[32:64] code_l=run_code[0:32] #64左右交换 run_code=code_r #右边32位扩展置换 code_r= self._functionE(code_r) #获取本轮子密钥 key_l=run_key[0:28] key_r=run_key[28:56] key_l=key_l[d[j]:28]+key_l[0:d[j]] key_r=key_r[d[j]:28]+key_r[0:d[j]] run_key=key_l+key_r key_y= self._functionKeySecondChange(run_key) #异或 code_r= self._codeyihuo(code_r,key_y) #S盒代替/选择 code_r= self._functionS(code_r) #P转换 code_r= self._functionP(code_r) #异或 code_r= self._codeyihuo(code_l,code_r) run_code+=code_r#32互换code_r=run_code[32:64]code_l=run_code[0:32]run_code=code_r+code_l#将二进制转换为16进制、逆初始置换output+=self._functionCodeChange(run_code) return output #异或 def _codeyihuo(self,code,key): code_len=len(key) return_list=‘‘ for i in range(code_len):if code[i]==key[i]: return_list+=‘0‘else: return_list+=‘1‘ return return_list #密文或明文初始置换 def _codefirstchange(self,code): changed_code=‘‘ for i in range(64):changed_code+=code[ip[i]-1] return changed_code #密钥初始置换 def _keyfirstchange (self,key): changed_key=‘‘ for i in range(56):changed_key+=key[pc1[i]-1] return changed_key #逆初始置换 def _functionCodeChange(self, code): lens=len(code)/4 return_list=‘‘ for i in range(lens):list=‘‘for j in range(4): list+=code[ip_1[i*4+j]-1]return_list+=“%x” %int(list,2) return return_list #扩展置换 def _functionE(self,code): return_list=‘‘ for i in range(48):return_list+=code[e[i]-1] return return_list #置换Pdef _functionP(self,code): return_list=‘‘ for i in range(32):return_list+=code[p[i]-1] return return_list #S盒代替选择置换 def _functionS(self, key): return_list=‘‘ for i in range(8):row=int( str(key[i*6])+str(key[i*6+5]),2)raw=int(str( key[i*6+1])+str(key[i*6+2])+str(key[i*6+3])+str(key[i*6+4]),2)return_list+=self._functionTos(s[i][row][raw],4) return return_list #密钥置换选择2 def _functionKeySecondChange(self,key): return_list=‘‘ for i in range(48):return_list+=key[pc2[i]-1] return return_list #将十六进制转换为二进制字符串 def _functionCharToA(self,code,lens): return_code=‘‘ lens=lens%16 for key in code:code_ord=int(key,16)return_code+=self._functionTos(code_ord,4) if lens!=0:return_code+=‘0‘*(16-lens)*4 return return_code #二进制转换 def _functionTos(self,o,lens): return_code=‘‘ for i in range(lens):return_code=str(o>>i &1)+return_code return return_code#将unicode字符转换为16进制def tohex(string): return_string=‘‘ for i in string: return_string+=“%02x”%ord(i) return return_stringdef tounicode(string): return_string=‘‘ string_len=len(string) for i in range(0,string_len,2): return_string+=chr(int(string[i:i+2],16)) return return_string#入口函数def desencode(from_code,key): #转换为16进制 from_code=tohex(from_code) key=tohex(key) des=DES() key_len=len(key) string_len=len(from_code)if string_len<1 or key_len<1: print ‘error input‘ return False key_code= des.code(from_code,key,string_len,key_len) return key_code#测试if __name__ == ‘__main__‘: print desencode(‘我是12345678刘就是我abcdwfd‘,‘0f1571c947刘‘)#返回密文为: 84148584371a6a1fe99e1da0ce1e34649b88ed15098e8aa4b8eb0bf24885c658 3. 解密文件 #_*_coding:utf-8_*_#!/usr/bin/env python#Filename:des.pyfrom desstruct import *import re__all__=[‘desdecode‘]class DES(): ‘‘‘解密函数,DES加密与解密的方法相差不大 只是在解密的时候所用的子密钥与加密的子密钥相反 ‘‘‘ def __init__(self): pass def decode(self,string,key,key_len,string_len): utput=“” trun_len=0 num=0 #将密文转换为二进制 code_string=self._functionCharToA(string,string_len) #获取字密钥 code_key=self._getkey(key,key_len) #如果密钥长度不是16的整数倍则以增加0的方式变为16的整数倍 real_len=(key_len/16)+1 if key_len%16!=0 else key_len/16 trun_len=string_len*4 #对每64位进行一次加密 for i in range(0,trun_len,64):run_code=code_string[i:i+64]run_key=code_key[num%real_len]#64位明文初始置换run_code= self._codefirstchange(run_code)#16次迭代for j in range(16): code_r=run_code[32:64] code_l=run_code[0:32] #64左右交换 run_code=code_r #右边32位扩展置换 code_r= self._functionE(code_r) #获取本轮子密钥 key_y=run_key[15-j] #异或 code_r= self._codeyihuo(code_r,key_y) #S盒代替/选择 code_r= self._functionS(code_r) #P转换 code_r= self._functionP(code_r) #异或 code_r= self._codeyihuo(code_l,code_r) run_code+=code_rnum+=1#32互换code_r=run_code[32:64]code_l=run_code[0:32]run_code=code_r+code_l#将二进制转换为16进制、逆初始置换output+=self._functionCodeChange(run_code) return output #获取子密钥 def _getkey(self,key,key_len): #将密钥转换为二进制 code_key=self._functionCharToA(key,key_len) a=[‘‘]*16 real_len=(key_len/16)*16+16 if key_len%16!=0 else key_len b=[‘‘]*(real_len/16) for i in range(real_len/16):b[i]=a[:] num=0 trun_len=4*key_len for i in range(0,trun_len,64):run_key=code_key[i:i+64]run_key= self._keyfirstchange(run_key)for j in range(16): key_l=run_key[0:28] key_r=run_key[28:56] key_l=key_l[d[j]:28]+key_l[0:d[j]] key_r=key_r[d[j]:28]+key_r[0:d[j]] run_key=key_l+key_r key_y= self._functionKeySecondChange(run_key) b[num][j]=key_y[:]num+=1 return b #异或 def _codeyihuo(self,code,key): code_len=len(key) return_list=‘‘ for i in range(code_len):if code[i]==key[i]: return_list+=‘0‘else: return_list+=‘1‘ return return_list #密文或明文初始置换 def _codefirstchange(self,code): changed_code=‘‘ for i in range(64):changed_code+=code[ip[i]-1] return changed_code #密钥初始置换 def _keyfirstchange (self,key): changed_key=‘‘ for i in range(56):changed_key+=key[pc1[i]-1] return changed_key #逆初始置换 def _functionCodeChange(self, code): return_list=‘‘ for i in range(16):list=‘‘for j in range(4): list+=code[ip_1[i*4+j]-1]return_list+=“%x” %int(list,2) return return_list #扩展置换 def _functionE(self,code): return_list=‘‘ for i in range(48):return_list+=code[e[i]-1] return return_list #置换P def _functionP(self,code): return_list=‘‘ for i in range(32):return_list+=code[p[i]-1] return return_list #S盒代替选择置换 def _functionS(self, key): return_list=‘‘ for i in range(8):row=int( str(key[i*6])+str(key[i*6+5]),2)raw=int(str( key[i*6+1])+str(key[i*6+2])+str(key[i*6+3])+str(key[i*6+4]),2)return_list+=self._functionTos(s[i][row][raw],4) return return_list #密钥置换选择2 def _functionKeySecondChange(self,key): return_list=‘‘ for i in range(48):return_list+=key[pc2[i]-1] return return_list #将十六进制转换为二进制字符串 def _functionCharToA(self,code,lens): return_code=‘‘ lens=lens%16 for key in code:code_ord=int(key,16)return_code+=self._functionTos(code_ord,4) if lens!=0:return_code+=‘0‘*(16-lens)*4 return return_code #二进制转换 def _functionTos(self,o,lens): return_code=‘‘ for i in range(lens):return_code=str(o>>i &1)+return_code return return_code#将unicode字符转换为16进制def tohex(string): return_string=‘‘ for i in string: return_string+=“%02x”%ord(i) return return_stringdef tounicode(string): return_string=‘‘ string_len=len(string) for i in range(0,string_len,2): return_string+=chr(int(string[i:i+2],16)) return return_string#入口函数def desdecode(from_code,key): key=tohex(key) des=DES() key_len=len(key) string_len=len(from_code) if string_len%16!=0: return False if string_len<1 or key_len<1: return False key_code= des.decode(from_code,key,key_len,string_len) return tounicode(key_code)#测试if __name__ == ‘__main__‘: print desdecode(‘84148584371a6a1fe99e1da0ce1e34649b88ed15098e8aa4b8eb0bf24885c658‘,‘0f1571c947刘‘ 解密后为: 我是12345678刘就是我abcdwfd 希望本文所述对大家的Python程序设计有所帮助, 作者:niuniu 字体:[增加 减小] 类型:转载 这篇文章主要介绍了python通过shutil实现快速文件复制的方法,涉及Python中shutil模块的使用技巧,需要的朋友可以参考下 本文实例讲述了python通过shutil实现快速文件复制的方法,分享给大家供大家参考。具体如下: python通过shutil实现快速文件拷贝,shutil使用起来非常方便,可以通过pip install shutil安装 from shutil import *from glob import globprint ‘BEFORE:‘, glob(‘shutil_copyfile.*‘)copyfile(‘sharejs.com.py‘, ‘sharejs.com.py.copy‘)print ‘AFTER:‘, glob(‘shutil_copyfile.*‘) 上面这段python代码用于将文件 sharejs.com.py 拷贝到sharejs.com.py.copy 希望本文所述对大家的Python程序设计有所帮助, 作者:pythoner 字体:[增加 减小] 类型:转载 这篇文章主要介绍了python使用cStringIO实现临时内存文件访问的方法,涉及Python使用cStringIO模块操作内存的技巧,需要的朋友可以参考下 本文实例讲述了python使用cStringIO实现临时内存文件访问的方法,分享给大家供大家参考。具体分析如下: 如果希望从网络读取文件进行处理,但是又不希望保存文件到硬盘,可以使用cStringIO模块进行处理 res = urllib2.urlopen(pic,timeout=10)f = cStringIO.StringIO(res.read()) f 是一个文件对象, 它和:f = open(‘c:/1.jpg‘,‘rw‘) 打开的文件一样 可以向操作本地文件一样对内存文件进行读写 希望本文所述对大家的Python程序设计有所帮助,篇3:python实现跨文件全局变量的方法
最近更 新
热 点 排 行
篇4:python实现DES加密解密方法实例详解
篇5:python通过shutil实现快速文件复制的方法
篇6:python使用cStringIO实现临时内存文件访问的方法