原文地址: Http://blog.163.com/qimeizhen8808@126/ 这女孩写的挺好,有值得学习的地方。
1) 文件的打开和创建,关闭
a)文件的打开和创建
主要有两个open()和file()两个方法。它们的功能是提供了初始化输入/输出(I/O)通用接口.
格式:file(name, mode [, buffering]] )
name:文件名称,相对路径和绝对路径都可以。
mode: 表示打开的模式,后面具体的介绍
buffering: 表示访问文件所采用的缓冲方式,其中0表示不缓冲,1表示只缓冲一行数据,> 1表示缓冲区的大小
mode模式:
r 以读方式打开
w 以写方式打开 (必要时清空, 没有则创建)
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开
a+ 以读写模式打开
b 打开二进制的文件。可以与 r, w,a, + 结合使用
U 支持所有的换行符号。 “ \r”, “\n”,“\r\n”
1)使用 'r' 或 'U' 模式打开的文件必须是已经存在的
2)使用 'w' 模式打开的文件若存在则首先清空, 然后(重新)创建
3)以 'a' 模式打开的文件是为追加数据作准备的, 所有写入的数据都将追加到文件的末尾.
举几个简单的示例:
---------r操作----------------------------------------------
>>> p=file("/home/jane/a.t","r")
>>> p.read()
'hello\nhello world\nhello world hello world\n\n'
>>> p.read(-1) #这里可以看出read()每次打开文件后,只能读取一次
''
>>> p.read(-1)
'hello\nhello world\nhello world hello world\n\n' #这里对-1我不是很明白!文件将被读取直至末尾
>>> p=file("/home/jane/a.t","r")
>>> p.read(2) #每次读取两个字节
'he'
>>> p=file("/home/jane/a.t","r")
>>> p.read(1) #每次读取一个字节
'h'
---------r+操作--------
>>> p=file("/home/jane/aa","r+")
>>> p.close()
>>>
这里向aa文件中,写入并追加了good
[jane@h3idan ~]$ t
ail -f aa
goodabc
aaaabbbbccc
123456777888
---------w操作(清空文件)--------
>>> p=file("/home/jane/aa","w")
>>> p.write("good")
>>> p.write("good")
>>> p.close()
这时
监控中断,并且从新查看值的时候,文件被清空,同时写入了两个good
[jane@h3idan ~]$ tail -f aa
goodabc
aaaabbbbccc
123456777888
tail: aa:文件已截断
[jane@h3idan ~]$ tail -f aa
goodgood
---------w+操作(清空文件)--------
>>> p=file("/home/jane/aa","w+")
>>> p.write("earth")
>>> p.close()
清空了文件,并写入了earth
[jane@h3idan ~]$ tail -f aa
goodgoodtail: aa:文件已截断
^C
[jane@h3idan ~]$ tail -f aa
earth
---------a+操作(清空文件)--------
>>> p.close()
>>> p=file("/home/jane/aa","a+")
>>> p.write("good")
>>> p.close()
>>> p=file("/home/jane/aa","a+")
>>> p.write("good")
>>> p.close()
>>>
写入并追加文件
[jane@h3idan ~]$ tail -f aa
earthgoodgood
需要思考:
w和w+的区别,w:写入并清空,w+读写并清空,这地方却没有明确看出运行时有什么区别!
r+和a+的区别: 他们都是读取并写入,a+可以追加(末尾加),但是r+是加在最前面
b)文件的关闭
close :FileObject.close() 关闭打开的文件对象
(2)文件的内建方法:
文件方法可以分为四类: 输入, 输出, 文件内移动, 以及杂项操作。如下表--文件对象的内建方法:
file.close()--关闭文件
file.fileno()--返回文件的描述符(file descriptor ,FD, 整数值)
file.flush()--刷新文件的内部缓冲区
file.isatty()--判断 file 是否是一个类 tty 设备
file.next()--返回文件的下一行
file.read(size=-1)---从文件读取 size 个字节, 当未给定 size 或给定负值的时候, 读取剩余的所有字节, 然后作为
字符串返回
上述定义不是很好理解,不如这个来的好:size: 读出文件的前 [size] 个字符 , 并输出给字符串,此时文件的指针指向 size 处
file.readline(size=-1)---从文件中读取并返回一行(包括行结束符), 或返回最大 size个字符
file.readlines(sizhint=0)--读取文件的所有行并作为一个列表返回(包含所有的行结束符);
file.seek(off, whence=0)--在文件中移动文件指针, 从 whence ( 0 代表文件其始, 1 代表当前位置, 2 代表文件末尾)偏移 off 字节
file.write(str)---向文件写入字符串
file.writelines(seq)---向文件写入字符串序列 seq
1)文件读取
read() 方法用来直接读取字节到字符串中, 最多读取给定数目个字节. 如果没有给定 size参数(默认值为 -1)或者 size 值为负, 文件将被读取直至末尾.
readline() 方法读取打开文件的一行(读取下个行结束符之前的所有字节). 然后整行,包括行结束符,作为字符串返回.
readlines() 方法它会读取所有(剩余的)行,然后把它们作为一个字符串列表返回.
eg:
>>> p=file("/home/jane/a.t","r")
>>> p.read()
'hello\nhello world\nhello world hello world\n\n'
>>> p=file("/home/jane/a.t","r")
>>> p.readline()
'hello\n'
>>> p=file("/home/jane/a.t","r")
>>> p.readlines()
['hello\n', 'hello world\n', 'hello world hello world\n', '\n']
>>>
我的a.t文件内容为:
hello
hello world
hello world hello world
2)文件写入
write() 方法它把含有文本数据或二进制数据块的字符串写入到文件中去.
writelines() 方法是针对列表的操作, 它接受一个字符串列表作为参数, 将它们写入文件. 行结束符并不会被自动加入, 所以如果需要的话, 你必须在调用writelines()前给每行结尾加上行
结束符.
eg:
-----write()------
>>> p=file("/home/jane/aa","w+")
>>> p.write("hello world")
>>> p.close()
>>>
这是aa文件的内容为:
[jane@h3idan ~]$ tail -f aa
hello world
-----writelines()------
>>> p=file("/home/jane/aa","w+")
>>> p.writelines(["a","b","c","d"])
>>> p.close()
>>>
这时候aa文件内容为:
[jane@h3idan ~]$ tail -f aa
abcd
3)内容查找和替换
文件的查找和替换是和循环相关的,给出个题目:a)计算a.t中所有hello的数目,b)将所有的hello 替换成good
a.t的文档内容为:
[jane@h3idan ~]$ cat a.t
hello
hello world
hello world hello world
【a解答】
# n is hello number
# i is hello number in eachline
import re
a=file("/home/jane/a.t","r")
n=0
for i in a.readlines():
p=re.findall("hello",i)
print p
if len(p)>0:
n=n+len(p)
print n
a.close()
或者
import re
a=file("/home/jane/a.t","r")
n=0
for i in a.readlines():
str=r"hello"
p=re.findall(str,i)
print p
if len(p)>0:
n=n+len(p)
print n
a.close()
【b解答】
#!/usb/bin/python
import re
a=file("/home/jane/a.t","r")
b=file("/home/jane/a2.t","w")
for i in a.readlines():
b.write(i.replace("hello","good"))
a.close()
b.close()
[jane@h3idan ~]$ cat a2.t
good
good world
good world good world
4)其他
seek(off, whence=0) 方法可以在文件中移动文件指针到不同的位置
next():FileObject.next()返回当前行,并将文件指针到下一行
(3)目录操作
对文件系统的访问大多通过 Python 的 os 模块实现. 该模块是 Python 访问
操作系统功能的主要接口. os 模块实际上只是真正加载的模块的
前端, 而真正的那个"模块"明显要依赖与具体的
操作系统.
os的功能:对进程和进程运行环境进行管理,os 模块还负责处理大部分的文件系统操作, 应用程序。
os.path的功能:可以完成一些针对路径名的操作. 它提供的函数可以完成管理和操作文件路径名中的各个部分, 获取文件或子目录信息, 文件路径查询等操作.对
a)os对目录的操作:
mkdir(path[,mode=0777])----创建目录
makedirs(name, mode=511)-----创建多层目录,
rmdir(path)------删除目录
removedirs(path)----删除多层目录
listdir(path)----列出指定目录的文件
getcwd() --- ---返回当前工作目录
chdir(path)-----改变当前工作目录
walk(top,topdown=True, onerror=None)---生成一个目录树下的所有文件名
chroot()----改变当前进程的根目录
示例:
****** ****mkdir()****************
>>> import os
>>> os.mkdir("/home/jane/qi",775)
>>> os.mkdir("/home/jane/qi2",0777) #这里的mode=0777(默认mode),一开始没有太明白,后来突然想起,应该是umask的原因,
linux中目录的默认umask是002,因此这里要是创建的具
有缺省权限的目录(775),所以mode-=0777 不缺定理解是否正确!
结果为:
dr-----r-t. 2 jane jane 4096 8月 16 02:55 qi
drwxrwxr-x. 2 jane jane 4096 8月 16 02:56 qi2
*****makedirs()****************
>>> os.makedirs("/home/jane/qi3/aa",511)
[jane@redhat aa]$ pwd
/home/jane/qi3/aa
[jane@redhat aa]$ ll -d
drwxrwxr-x. 2 jane jane 4096 8月 16 03:15 . # 可以看出被创建的目录也是具有775的权限的
[jane@redhat aa]$
help(makedirs)的帮助文档,显示是511这个我不是很明白?
makedirs(name, mode=511)
makedirs(path [, mode=0777])
********* 其他**********
>>> os.rmdir("/home/jane/qi")
>>> os.removedirs("/home/jane/qi3/aa")
>>> os.listdir("/home/jane/qimeizhen")
['.test4.py.swp', '4.py', '.11.py.swp', 'test1.py', 'q.py', '1.py', '6.py', 'raw.py', '7.py', '5.py', 'for.py', '9.py', 'test2.py', 'test3.py', '3.py', '10.py', '2.py',
'8.py']
>>> os.getcwd()
'/home/jane'
>>> os.chdir("/home/jane/qimeizhen")
>>> os.getcwd()
'/home/jane/qimeizhen'
b)os对文件的操作
remove()/unlink() --- 删除文件
rename()/renames()---重命名文件
**********rename()and remove***************
>>> p=file("/home/jane/aa","w")
>>> p.write("hello world")
>>> p.close()
>>> os.rename("/home/jane/aa","/home/jane/ab")
c)os访问/权限
access()----------检验权限模式
chmod()-----------改变权限模式
chown()/lchown()-----改变 owner 和 group ID/功能相同, 但不会跟踪链接
umask()-------设置默认权限模式
d)os文件描述符操作
open()---底层的操作系统 open (对于文件, 使用标准的内建 open() 函数)
read()/write()---根据文件描述符读取/写入数据
dup()/dup2()----复制文件描述符号/功能相同, 但是是复制到另一个文件描述符设备号
makedev()-----从 major 和 minor 设备号创建一个原始设备号
e) 目录的遍历
方法有三种:
Os.path.walk() 函数
Os.walk() 函数
**************************递归函数遍历**************************************
#!/usr/bin/python
#递归遍历目录(传统方法)
import os
def VisitDir(path):
li=os.listdir(path)
for p in li:
pathname=os.path.join(path,p)
if not os.path.isfile(pathname):
VisitDir(pathname)
else:
print pathname
if __name__=="__main__":
path="/home/jane/qimeizhen"
VisitDir(path)
~
**************************os.path.walk()函数**************************************
格式: walk(top, func, arg)
? 说明:
? top: 要遍历的目录树
? Func: 表示回调函数
? arg: 参数元组
------------------
#!/usr/bin/python
#encoding=utf-8
#使用os.path.walk遍历
import os, os.path
def visitDir(arg, dirname, names):
for filepath in names:
print os.path.join(dirname,filepath)
if __name__ == "__main__":
path = r"/home/jane/qimeizhen"
os.path.walk(path, visitDir, ())
*******************************Os.walk() 函数******************************************************
格式: os.walk(top, topdown= True, onerror=None)
top: 需要遍历的目录树路径
topdown: =True 表示首先返回目录中的文件,然后在遍历子目录; =False 时,首先遍历目录的子目录,然后遍历目录文件,最后返回根目录文件
Onerror=None: 是默认值,忽略遍历中出现的错误,否则更具自定义函数输出异常
#!/usr/bin/python
#encoding=utf-8
#使用os.walk遍历
import os
def VisitDir(path):
for root,dirs,files in os.walk(path):
for filespath in files:
print os.path.join(root,filespath)
0