Python提供了os、os.path等模块用于处理文件,熟练使用这些模块中的函数有助于应用。文件可以通过调用open或file来打开,open通常比file更通用,因为file几乎都是为面向对象程序设计量身打造。
#!/usr/bin/env python #-*- encoding:UTF-8 -*- #文件的读取 import os, sys filename = "file.data" if not os.path.exists(filename): #文件存在 sys.exit(0) ###按行读取方式readline() fd = open(filename, "r") while True: line = fd.readline() if line: print line, #保留换行符 else: break fd.close() print "-"*8 ###多行读取方式readlines() fd = file(filename, "r") #等价与open lines = fd.readlines() for line in lines: print line, fd.close() print "-"*8 ###一次性读取方式read() fd = open(filename, "r") content = fd.read() #读取文件所有内容 print content, print "length:", fd.tell() #文件总长度 fd.seek(0) #文件指针返回文件开头,否则再读取不到内容 content = fd.read(5) #读取前5个字节内容 print content, print "---", fd.tell() #当前文件指针位置 content = fd.read() #读取5个字节后的所有内容 print content, print "-"*8 ###简介的读取文件方法 for line in open(filename): print line,
#!/usr/bin/env python #-*- encoding:UTF-8 -*- #文件的读取 import os, sys filename = "file.data" fd = file(filename, "w+") #读取方式打开,清除文件原来内容 fd.write("goodbye\n") fd.close() fd = file(filename, "a+") #追加方式打开 content = ["helloworld\n", "how are you\n"] fd.writelines(content) #写入列表内容 fd.close()
(1)查找及解析配置文件
#!/usr/bin/env python #-*- encoding:UTF-8 -*- import os, sys filename = "file.data" fd = open(filename) for line in fd.readlines(): if "he" in line and "world" in line: #查找文件内容 print "found:", line if line.strip().upper().endswith("BYE"): #过滤空格并统一大写,比较末尾字符串 print "found:", line fd.close() fd = file(filename, "w+") content = ['#configure\n', '"name"\t=', ' "taiyang"\n'] fd.writelines(content) #写入列表内容 fd.close() #解析常用配置文件 "name" = "taiyang" fd = file(filename, "r") lines=fd.readlines() print "content:", lines print "-"*10 infoDict={} #解析 for i in range(0, len(lines)): if lines[i].strip().startswith("#"): continue strlist = lines[i].strip("\r").strip("\n").split("=") if len(strlist) != 2: continue key = "" keystr = strlist[0].strip() value = strlist[1].strip() if keystr.startswith('"') or keystr.startswith("'"): if keystr.endswith('"') or keystr.endswith("'"): key = keystr[1:len(keystr)-1] if value.startswith('"') or value.startswith("'"): if value.endswith('"') or value.endswith("'"): infoDict[key]=value[1:len(value)-1] for key in infoDict: print 'key=%s, value=%s' % (key, infoDict[key])
(2)列出文件列表
import os, fnmatch, glob, os.path for fileName in os.listdir('.'): #列出当前目录内容,不包括.和..,不递归 print fileName, os.mkdir('pydir') #在当前目录下创建目录,但只能创建一层 os.rmdir( 'pydir') #在当前目录下删除目录,但只能删除一层 os.makedirs('pydir/a') #可创建多层目录 os.removedirs('pydir/a') #可删除多层目录 if os.path.exists('hello.txt') #判断文件存在则删除 os.rename('hello.txt', 'hi.txt') #文件重命名 os.remove('hi.txt') if os.path.exists('file.txt') src = file('file.txt', 'r') #文件的复制 dst = file('file2.txt', 'w') dst.write(src.read()) src.close() dst.close() import shutil if os.path.exists('file.txt') #shutil模块实现文件的复制和移动 shutil.copyfile('file.txt', 'file3.txt') #文件复制 shutil.move('file3.txt', '../') #文件移动 shutil.move('file3.txt', 'file4.txt') #文件重命名 print '\n---fnmatch module' for fileName in os.listdir('.'): if fnmatch.fnmatch(fileName, '*.txt'): #利用UNIX风格的通配,只显示后缀为txt的文件 print fileName, print '\n---glob module' for fileName in glob.glob('*.txt'): #利用UNIX风格的通配,只显示后缀为txt的文件 print fileName,
(3)获取文件状态
#!/usr/bin/env python #-*- encoding:UTF-8 -*- #获取文件状态 import os, time, stat import os.path #stat模块描述了os.stat(filename)返回的文件属性列表中各值的意义 filestats = os.stat('country.xml') #获取文件/目录的状态 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 fileInfo for field in fileInfo: #显示对象内容 print '%s:%s' % (field, fileInfo[field]) #for infoField,infoValue in fileInfo: # print '%s:%s' % (infoField,infoValue) if stat.S_ISDIR(filestats[stat.ST_MODE]): #判断是否路径 print 'Directory.' else: print 'Non-directory.' if stat.S_ISREG(filestats[stat.ST_MODE]): #判断是否一般文件 print 'Regular file.' 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.' filename = 'country.xml' if os.path.isdir(filename): #判断是否路径 print 'Directory.' elif os.path.isfile(filename): #判断是否一般文件 print 'File.' elif os.path.islink (filename): #判断是否链接文件 print 'Shortcut.' elif os.path.ismount(filename): #判断是否挂接点 print 'Mount point.'
(4)串行化文件和内存文件
#!/usr/bin/env python #-*- encoding:UTF-8 -*- import pickle #串行化文件 #cpickle是用C写的pickle模块,比标准的pickle速度快很多,使用方法同pickle filehandlerwrite = open('pickle.txt','w') text = ['this is a pickle demonstrate','aa','bb'] pickle.dump(text, filehandlerwrite) #把text的内容序列化后保存到pickle.txt文件中 filehandlerwrite.close() filehandlerread = open('pickle.txt') textlist = pickle.load(filehandlerread) #还原序列化字符串 print textlist filehandlerread.close() import StringIO #内存文件 #cStringIO是用C写的StringIO模块,执行速度比StringIO快,使用方法同StringIO fileHandle = StringIO.StringIO("memory content.") #create file in memory print fileHandle.read() #print fileHandle.close()
(1)Python的标准库中提供了许多相关的模块进行文件管理,可以参考相应文档。
(2)目录的递归遍历(os.path.walk和os.walk),文件与流对象(stdin、stdout、stderror),ConfigParser模块进行配置文件解析等内容需要进一步查看其他资料。
(3)若有不足,请留言,在此先感谢!