提供个人写的文件操作python脚本。
个人觉得不管哪个语言删除、移动都是最常用的文件操作,遗憾的是见到的语言文件库基本都不提供。不过也可以理解,这类文件操作效率太差。库的设计者指望用户使用read和write完成这类操作,效率由用户保证。
文件IO操作尤其需要注意效率,而提高效率最重要的是使用缓冲。一个字节一个字节读写完成文件操作的版本效率低的令人震惊。我已经将这个版本注释,读者有兴趣的话可以参考对比。
又一次重复发明轮子,虽然不值得提倡,不过动手实践倒是纠正了一些文件移动操作常识性误解。另外提供测试程序。欢迎拍砖。
# -*- coding: cp936 -*-
# All rights reserved.
# Written by soliddream <soliddream at 163.com>
"""
wrap file operate
"""
def FileDelete(fileObject,position,length):
fileSize = FileSize(fileObject)
if(fileSize<position+length):
print 'error.string deleted exceed limit when execute FileDelete'
return
fileObject.seek(position)
deletedStr = fileObject.read(length)
movedStr = fileObject.read(fileSize-position-length)
fileObject.seek(position)
fileObject.write(movedStr)
fileObject.truncate(fileSize-length)
return deletedStr
"""
anotherFileObject = open(fileObject.name, 'rb')
anotherFileObject.seek(position+length)
fileObject.seek(position)
while(1):
byte = anotherFileObject.read(1)
if not byte:
break
fileObject.write(byte)
fileObject.truncate(anotherFileObject.tell()-length)
anotherFileObject.close()
"""
def FileMove(fileObject,position,length,newPosition):
fileSize = FileSize(fileObject)
if((fileSize<position+length) or (fileSize<newPosition) \
or position==newPosition or position<0):
print 'error.FileMove Invalid argument'
return
fileObject.seek(position)
strmoved = fileObject.read(length)
if(position<newPosition):
lenDomino = newPosition-position-length+1
fileObject.seek(position+length)
strDomino = fileObject.read(lenDomino)
fileObject.seek(position)
fileObject.write(strDomino)
fileObject.write(strmoved)
else:
lenDomino = position-newPosition
fileObject.seek(newPosition)
strDomino = fileObject.read(lenDomino)
fileObject.seek(newPosition)
fileObject.write(strmoved)
fileObject.write(strDomino)
"""
anotherFileObject = open(fileObject.name, 'rb')
anotherFileObject.seek(position)
strmoved = anotherFileObject.read(length)
forNumber = 0
if(position<newPosition):
anotherFileObject.seek(position+length)
fileObject.seek(position)
forNumber = newPosition-position
else:
anotherFileObject.seek(newPosition)
fileObject.seek(newPosition+length)
forNumber = position-newPosition
for i in range(0,forNumber):
byte = anotherFileObject.read(1)
fileObject.write(byte)
fileObject.seek(newPosition)
fileObject.write(strmoved)
anotherFileObject.close()
"""
def FileSearch(fileObject,subString, beginPosition=0):
fileObject.seek(beginPosition)
fileString = fileObject.read();
foundPosition = fileString.find(subString)
if foundPosition!=-1:
foundPosition += beginPosition
return foundPosition
def FileSize(fileObject):
originPosition = fileObject.tell()
fileObject.seek(0, os.SEEK_END)
fileSize = fileObject.tell()
fileObject.seek(originPosition)
return fileSize
def testMyFileFuction():
print '-----------------------'
print 'test FileDelete'
string = StringIO()
string.write('0123456789')
FileDelete(string,3,3)
string.seek(0)
if string.read()=='0126789':
print 'FileDelete OK'
else:
print 'FileDelete Failed'
print '-----------------------'
print 'test FileMove'
string.seek(0)
string.write('0123456789')
FileMove(string,3,3,0)
string.seek(0)
fileMoveResult1=string.read()
string.seek(0)
string.write('0123456789')
FileMove(string,3,3,7)
string.seek(0)
fileMoveResult2 = string.read()
if fileMoveResult1 == '3450126789' and fileMoveResult2 == '0126734589':
print 'FileMove OK'