第六篇 文本操作和管理上下文
一、打开文件
文件句柄 = open(file, mode='r', buffering=-1, encoding=None)
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
- r ,只读模式【默认】
- w,只写模式【不可读;不存在则创建;存在则清空内容;】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,当以二进制的方式的效率比较高,因为磁盘底层是以字节存储
二、操作
对于文件也是个迭代对象,所以循环遍历文件的每一行用的非常多
f = open('/etc/passwd','r')
for line in f:
print(line)
f.close() 关闭文件
f.fileno() 返回文件描述符
f.readline() 从当前指针读取一行
f.readlines() 从当前指针读取到结尾的全部行
f.read() 从当前指针读多少个字节,没有参数读取全部
f.tell() 告诉当前指针,是字节
f.seek(offset [whence]) 移动指针,f.seek(0)把指针移动第一行第0个字节位置
offset: 偏移量
whence: 位置
0: 从文件头
1:从当前位置
2:从文件尾部
f.write(string) 打开文件时,文件不存在,r,r+都会报错,其他模式则不会
f.writelines() 必须是字符串序列,把字符串序列当作一个列表写进文件
f.flush() 在文件没有关闭时,可以将内存中的数据刷写至磁盘
f.truncate() 文件截取多少字节保留,指针后面的内容全部会清空
f.name 是返回文件名字,不是方法,是属性
f.closed 判断文件是否已经关闭
f.encoding 查看编码格式,没有使用任何编码,则为None
f.mode 打开文件的模式
f.newlines 显示出换行符的,空为默认\n不显示
一些例子:
#打开模式没有b则打开的字符串
f = open('db','r')
data = f.read()
print(data,type(data))
f.close()
#打开模式有b则打开的时字节
f1 = open('db','rb')
data = f.read()
print(data,type(data))
f.close()
# 打开模式有w和b则写入的字符串需要转换成字节
f2 = open('db','ab')
f.write(bytes("hello",encoding="utf-8"))
f.close()
f3 = open('db','a+',encoding="utf-8")
# 如果打开模式无b,则read,按照字符读取
data = f3.read(1)
# tell当前指针所在的位置(字节)
print(f3.tell())
# 调整当前指针你的位置(字节),写的话会覆盖原来的
f3.seek(f3.tell())
f3.write("777")
f3.close()
三、管理上下文
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open('log','r') as f:
...
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理,即:
(1)读取一个文件中的10行写入另外一个文件中
with open('db1','r',encoding="utf-8") as f1,open('db2','w',encoding="utf-8") as f2:
times = 0
for line in f1:
times += 1
if times <= 10:
f2.write(line)
else:
break
(2)将一个文件一行一行读取并批量替换并写入另外一个文件
with open('db1','r',encoding="utf-8") as f1,open('db2','w',encoding="utf-8") as f2:
for line in f1:
new_str = line.replace('ales','st')
f2.write(new_str)
(3)假设现在有这样一个需求,有一个10G大的文件,如何拷贝到另一个文件中去?下面将讲一下如何同时打开两个文件进行处理,以及文件太大的时候如何读取用with语句就可以同时打开两个文件,一个读,一个写。假设1.txt文件有10G大,如果用read则一次性就将内容读到内存中去了,这显然不合适,如果用readline()的话虽然也可以读一行,但是并不知道何时结束,但是可以用for循环读取文件这个可迭代的对象,一行行的读取。下面三行代码就可以实现了
with open('1.txt','r',encoding='utf-8') as fread,open('2.txt','w') as fwrite:
for line in fread: #一行行的读
fwrite.write(line) #一行行的写
文件系统功能:import os
目录相关:
os.getcwd() 返回当前工作目录
os.chdir() 切换目录
os.chroot() 设定当前进程的根目录
os.listdir() 列出指定目录下的所有文件名
os.mkdir() 创建指定目录
os.makedirs() 创建多级目录
os.rmdir() 删除陌路
os.removedirs() 删除多级目录
文件相关:
os.mkfifo() 创建管道文件
os.mknod() 创建设备文件
os.remove() 删除文件
os.rename() 文件重命名
os.stat() 查看文件的状态属性
os.symlink() 创建链接文件
os.unlink() 删除链接文件
os.utime() 更新文件时间戳
os.tmpfile() 创建并打开(w+b)一个新的
os.walk() 生成目录结构的生成器
访问权限:
os.access() 检验文件某个用户是否有访问权限
os.chmod() 修改权限
os.chown() 修改属主属组
os.umask() 设置默认权限模式
文件描述符:
os.open() 根据文件描述打开
os.read() 根据文件描述读
os.write() 根据文件描述符写
创建设备:
os.mkdev() 创建设备文件
os.major() 获取设备主版本号
os.minor() 获取设备次版本号
用户相关:
os.getuid() 获取当前用户的uid
os.getgid() 获取当前用户的gid
文件路径:
os.path.basename() 路径基名
os.path.dirname() 路径目录名
os.path.join() 将dirname()和basename()连接起来
os.path.split() 返回dirname(),basename()元组
os.path.splitext() 返回(filename,extension)元组
os.path.getatime()
os.path.getctime()
os.path.getmtime()
os.path.getsize() 返回文件的大小
os.path.exists() 判断指定文件是否存在
os.path.isabs() 判断指定的路径是否为绝对路径
os.path.isdir() 判断是否为目录
os.path.isfile() 判断是否为文件
os.path.islink() 判断是否为链接文件
os.path.ismount() 判断是否为挂载点
os.path.samefile() 判断两个路径是否指向了同一个文件
对象持久存储:
pickle模块
marshal
DMB接口
shelve模块
pickle.dump()
pickle.load()
示例:
>>> dir1 = os.path.dirname('/etc/sysconfig/network-scripts')
>>> file1 = os.path.basename('/etc/sysconfig/network-scripts')
>>> print(dir1,file1)
/etc/sysconfig network-scripts
>>> os.path.join(dir1,file1)
'/etc/sysconfig/network-scripts'
示例:
>>> for filename in os.listdir('/tmp'):
print(os.path.join('/tmp',filename))
示例:判断文件是否存在,存在则打开
让用户通过键盘反复输入多行数据
追加保存至此文件中
#!/usr/bin/env python27
import os
import os.path
filename = '/tmp/test2.txt'
if os.path.isfile(filename):
f1 = open(filename,'a+')
while True:
line = raw_input('Enter somethin> ')
if line == 'q' or line == 'quit':
break
f1.write(line+'\n')
f1.close()
示例:将字典写入文件中,并还原
>>> import pickle
>>> d1 = {'x':123,'y':567,'z':'hello world'}
>>> f5 = open('/tmp/dfile.txt','a+')
>>> pickle.dump(d1,f5)
>>> f5.flush()
>>> f5.close()
>>> f6 = open('/tmp/dfile.txt','r')
>>> d2 = pickle.load(f6)
>>> print(d2)
{'y': 567, 'x': 123, 'z': 'hello world'}

浙公网安备 33010602011771号