首页 > 脚本语言 > python > 实例浅谈之六Python读写文件
2015
07-24

实例浅谈之六Python读写文件

一、简介

 

Python提供了os、os.path等模块用于处理文件,熟练使用这些模块中的函数有助于应用。文件可以通过调用open或file来打开,open通常比file更通用,因为file几乎都是为面向对象程序设计量身打造。

二、详解

 

1、文件的读取(四种方式)

 

使用readline()、readlines()或read()函数读取文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
#!/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,

实例浅谈之六Python读写文件 - 第1张  | 大话运维

2、文件的写入(二种方式)

 

write()把字符串写入文件,writelines()把列表中存储的内容写入文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/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()

实例浅谈之六Python读写文件 - 第2张  | 大话运维

3、文件操作

(1)查找及解析配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/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])

实例浅谈之六Python读写文件 - 第3张  | 大话运维

(2)列出文件列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
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,

实例浅谈之六Python读写文件 - 第4张  | 大话运维

(3)获取文件状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/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.'
 
 

实例浅谈之六Python读写文件 - 第5张  | 大话运维

(4)串行化文件和内存文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/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()

实例浅谈之六Python读写文件 - 第6张  | 大话运维

三、总结

(1)Python的标准库中提供了许多相关的模块进行文件管理,可以参考相应文档。
(2)目录的递归遍历(os.path.walk和os.walk),文件与流对象(stdin、stdout、stderror),ConfigParser模块进行配置文件解析等内容需要进一步查看其他资料。

 

 

 

最后编辑:
作者:saunix
大型互联网公司linux系统运维攻城狮,专门担当消防员

留下一个回复