一、python中文件管理
文件管理是很多应用程序的基本功能和重要组成部分。Python可以使文件管理极其简单,特别是和其它语言相对比。
1.介绍
几乎以任何语言编写的众多应用程序中,文件管理是很重要的一部分。Python当然也不例外。在这篇文章中,我们将探究如何使用一些模块来操作文件。我们会完成读文件,写文件,增加文件内容的操作,写文件,增加文件内容的操作,还有一些另类的用法。
2.文件读写
最简单文件操作--读取
FileRead = open("test.txt",‘r‘) FileRead.read() #读取文件所有内容,使用print(FileRead.read())函数输出文件内容 FileRead.close()
FileRead = open("test.txt",‘r‘) for lines in FileRead.readlines(): print("lines:",lines.strip(‘\n‘)) FileRead.close() #输出结果 lines: Hello World lines: Welcome To Beijing 文件循环读取行
Python在读取一个文件时,会记住其在文件中的位置。所有在调用FileRead.readline()的时候会从上次读取的位置开始
FileRead = open("test.txt",‘r‘) print(FileRead.readline().strip(‘\n‘)) #读取第一行数据 print(FileRead.readline().strip(‘\n‘)) #读取第二行数据 FileRead.close()
使用seek(0)将文件读取的行位置标记到指定的位置
FileRead = open("test.txt",‘r‘) print(FileRead.readline().strip(‘\n‘)) #读取第一行数据 FileRead.seek(0) #将上次读取的位置调回到首行位置 print(FileRead.readline().strip(‘\n‘)) #读取第一行数据 FileRead.close()
使用tell()获取python在文件中的当前位置
FileRead = open("test.txt",‘r‘) print(FileRead.readline().strip(‘\n‘)) #读取第一行数据 print(FileRead.tell()) #获取python所在文件中的当前位置 print(FileRead.readline().strip(‘\n‘)) #读取第二行数据 FileRead.close()
初级操作--写数据到文件
FileRead = open("test.txt",‘w‘) #‘w’--是指文件将被写入数据,已有的数据将会被清空 FileRead.write(‘Hello Everybody!\nWelcome To China!‘) #被写入文件的数据,使用‘\n’可以实现换行操作 FileRead.close() #关闭文件句柄,每次读写文件都应该在最后面将文件关闭
FileRead = open("test.txt",‘a‘) #‘a’--是指文件将被写入数据,已有的数据不会被清空,在已有数据后面追加下面要添加的数据 FileRead.write(‘Hello Everybody!\nWelcome To China!‘) #被写入文件的数据,使用‘\n’可以实现换行操作 FileRead.close() #关闭文件句柄,每次读写文件都应该在最后面将文件关闭
文件的高级操作--‘rb’ ‘wb‘--使用此模式打开文件是读写二进制文件
二、从现有文件中获取数据
使用Python中的模块,可以从现有文件中获取信息。使用“os”模块和“stat”模块可以获取文件的基本信息:
#!/usr/local/env python3 import os import stat import time FileStats = os.stat(‘test.txt‘) #获取文件的基本信息 FileInfo = { ‘Size‘ : FileStats [ stat.ST_SIZE ], #文件大小 ‘LastModified‘ : time.ctime(FileStats[ stat.ST_MTIME]), ‘LastAccessed‘ : time.ctime(FileStats[stat.ST_ATIME]), ‘CreationTime‘ : time.ctime(FileStats[stat.ST_CTIME]), ‘Mode‘ : FileStats [ stat.ST_MODE ] } print(FileStats) #os.stat_result(st_mode=33206, st_ino=6473924464448069, st_dev=434835, st_nlink=1, st_uid=0, st_gid=0, st_size=70, st_atime=1451980042, st_mtime=1451981189, st_ctime=1451979747) print(FileInfo) #{‘Size‘: 70, ‘Mode‘: 33206, ‘LastAccessed‘: ‘Tue Jan 5 15:47:22 2016‘, ‘LastModified‘: ‘Tue Jan 5 16:06:29 2016‘, ‘CreationTime‘: ‘Tue Jan 5 15:42:27 2016‘} 获取文件的相关信息
判断文件是不是目录
#!/usr/local/env python3 ‘‘‘ Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:[email protected] ‘‘‘ import os import stat import time def DirIf(FilenName): FileStats = os.stat(FilenName) #获取文件的基本信息 FileInfo = { ‘Size‘ : FileStats [ stat.ST_SIZE ], #文件大小 ‘LastModified‘ : time.ctime(FileStats[ stat.ST_MTIME]), ‘LastAccessed‘ : time.ctime(FileStats[stat.ST_ATIME]), ‘CreationTime‘ : time.ctime(FileStats[stat.ST_CTIME]), ‘Mode‘ : FileStats [ stat.ST_MODE ] } if stat.S_ISDIR( FileStats[ stat.ST_MODE ] ): #判断文件是不是目录 return True else: return False 判断目录函数封装
对上面封装的函数进行调用的方法:
if DirIf(‘test.txt‘) == True: print("目录") elif DirIf(‘test.txt‘) == False: print(‘非目录‘)
判断文件类型
#!/usr/local/env python3 ‘‘‘ Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:[email protected] ‘‘‘ import os import stat FileStats = os.stat(‘test.txt‘) FileMode = FileStats[stat.ST_MODE] if stat.S_ISREG(FileStats[stat.ST_MODE]): #普通文件判断 print(‘Regular file.‘) elif stat.S_ISDIR(FileStats[stat.ST_MODE]): #目录文件判断 print(‘Directory.‘) elif stat.S_ISLNK(FileStats[stat.ST_MODE]): #快捷方式(链接)文件 print(‘Shortcut.‘) elif stat.S_ISSOCK(FileStats[stat.ST_MODE]): #套接字文件 print(‘Socket.‘) elif stat.S_ISFIFO(FileStats[stat.ST_MODE]): #命名管道文件 print(‘Named pipe.‘) elif stat.S_ISBLK(FileStats[stat.ST_MODE]): #块设备文件 print(‘Block special device.‘) elif stat.S_ISCHR(FileStats[stat.ST_MODE]): #特殊字符型文件 print(‘Character special device.‘) 文件类型判断
import os.path FileStats = ‘test.txt‘ if os.path.isdir(FileStats): #判断文件是否是目录 print(‘Directory.‘) elif os.path.isfile(FileStats): #判断文件是否是文件 print(‘File.‘) elif os.path.islink(FileStats): #判断文件是否是快捷方式(链接)文件 print(‘Shortcut.‘) elif os.path.ismount(FileStats): #判断文件是否是挂载文件 print(‘Mount point.‘) 使用os.path()判断文件类型
获取文件中的行数
def Countnum(filename): files = open(filename) data = files.read() files.flush() files.close() return data.count(‘\n‘)
三、python对目录的操作
和普通文件一样,关于目录的操作也很容易掌握。首先,列出一个目录的内容:
import os for fileName in os.listdir ( ‘/‘ ): print(fileName)
创建目录 import os os.mkdir(‘testDir‘) 创建多级目录 import os os.makedirs(‘testDir/test2/test3/test4‘) #os.makedirs() 删除多级空目录 import os os.removedirs(‘testDir/test2/test3/test4‘) 删除目录 import os os.rmdir(‘testDir‘)
四、python对特定类型的文件进行操作
使用fnmatch模块显示‘.txt‘和‘.exe‘文件名
import fnmatch import os for FileName in os.listdir(‘/‘): if fnmatch.fnmatch(FileName,‘*.txt‘): print(open(FileName).read()) elif fnmatch.fnmatch(FileName,‘*.exe‘): print(FileName) python搜索指定类型的文件
“fnmatch”模块支持正则表达式:
import fnmatch import os import re FilePattern = fnmatch.translate(‘*.txt‘) for FileName in os.listdir(‘./‘): if re.match(FilePattern,FileName): print(‘Text file.‘)
使用glob模块查找一种类型的文件比较方便
import glob for FileName in glob.glob(‘*.txt‘): print(FileName) print(‘Text file.‘)
使用数字匹配文件名
import glob for FileName in glob.glob ( ‘[0-9].txt‘ ): print(Filename)
五、数据编组
使用前一节中介绍的模块,可以实现在文件中对字符串的读写。然而,有的时候,你可能需要传递其它类型的数据,如list、tuple、dictionary和其它对象。在Python中,你可以使用Pickling来完成。你可以使用Python标准库中的“pickle”模块完成数据编组。
编组一个包含数字和字符的列表:
#!/usr/local/env python3 import pickle FileHandle = open( ‘PickleFile.txt‘,‘wb‘) TestList = [‘This‘,2,‘is‘,1,‘a‘,0,‘test.‘] pickle.dump(TestList,FileHandle ) FileHandle.close()
拆分编组:
#!/usr/local/env python3 import pickle FileHandle = open(‘PickleFile.txt‘,‘rb‘) #注意要加‘b‘进行二进制读写操作,否则报错 TestList = pickle.load(FileHandle) print(TestList) FileHandle.close()
错误
TypeError: must be str, not bytes错误: 解答: 写文件处 open(filename, ‘w‘).write 应该写为 open(filename, ‘wb‘).write
复杂编组:
import pickle FileHandle = open(‘PickleFile.txt‘,‘wb‘) TestList = [ 123, { ‘Calories‘ : 190 }, ‘swht‘, [ 1, 2, 7 ] ] pickle.dump(TestList,FileHandle) FileHandle.close()
拆组:
import pickle FileHandle = open(‘PickleFile.txt‘,‘rb‘) TestList = pickle.load(FileHandle) print(TestList) FileHandle.close()
比较:在python2.7版本里还有一个模块,相对于pickle模块而言,处理速度更快。当然在python3已经将其去掉,或者将其性能整合到pickle模块中了。
#!/usr/local/env python2 import cPickle FileHandle = open(‘PickleFile.txt‘,‘wb‘) TestList = [ 123, { ‘Calories‘ : 190 }, ‘swht‘, [ 1, 2, 7 ] ] cPickle.dump(TestList,FileHandle) FileHandle.close()
六、创建虚拟文件
你用到的许多模块包含需要文件对象作为参数的方法。但是,有时创建并使用一个真实的文件并让人感到有些麻烦。所幸的是,在Python中,你可以使用“StringIO”或者“cStringIO”模块来创建文件并将其保存在内存中,但很不幸的是,这两个模块在python3中都已经被移除。如果你使用的是python2的环境,可以尝试使用一下:
#!/usr/local/env python2 import StringIO FileHandle = StringIO.StringIO("Let freedom ring") #创建的文件存在内存中 print(FileHandle.read()) # "Let freedom ring." FileHandle.close()
#!/usr/local/env python2 import cStringIO FileHandle = cStringIO.cStringIO("Let freedom ring") #创建的文件存在内存中 print(FileHandle.read()) # "Let freedom ring." FileHandle.close()