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)若有不足,请留言,在此先感谢!