Python中文件操作可以分为三步:
-
打开文件,得到文件句柄并赋值给一个变量
-
通过句柄对文件进行操作
-
关闭文件
打开文件模式
打开文件的模式有:
-
r,只读模式(默认)。
-
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
-
a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
-
r+,可读写文件。【可读;可写;可追加】
-
w+,写读
-
a+,同a
"U"表示在读取时,可以将
自动转换成
(与 r 或 r+ 模式同使用)
-
rU
-
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
-
rb
-
wb
-
ab
操作文件内容如下:
I took a pill in Ibiza
我在Ibiza岛上嗑药
To show Avicii I was cool
为了让Avicii觉得我很酷
And when I finally got sober, felt 10 years older
当我终于清醒过来了 仿佛已经是十年之后
But fuck it, it was something to do
但操他妈的 那也算是消遣了
I'm living out in LA
我住在LA
I drive a sports car just to prove
我开跑车只为了证明
I'm a real big baller cause I made a million dollars
我真的超屌能赚百万
And I spend it on girls and shoes
然后我把它们全部都花在妞和鞋上
But you don't wanna be high like me
但你不会想和我一样拥有这么多
Never really knowing why like me
我都不明白为什么人想要得到这么多
You don't ever wanna step of that roller coaster and be all alone
(一旦你拥有过之后)你就再也不想离开这过山车 再变得独自一人
You don't wanna ride the bus like this
你不会想要过这样的生活
Never knowing who to trust like this
像这样永远不知道能信任谁
You don't wanna be stuck up on that stage singing
你不会想在台上自我感觉良好地唱歌 受到万人追捧
Stuck up on that stage singing
不想这样骄傲地在台上唱歌
All I know are sad songs, sad songs
我只知道 我只想唱 那些悲伤的歌
Darling, all I know are sad songs, sad songs
宝贝儿 我真的只知道 只想唱 那些悲伤的歌
文件操作常用功能
1、read()、readline()、readlines()的区别
#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Author: Lucky.chen
f = open('aa.txt', encoding='utf-8')
print(f)
# 打印出来的是一个文件句柄信息:<_io.TextIOWrapper name='aa.txt' mode='r' encoding='utf-8'>
print(f.read()) # 打印出来的就是文件所有的内容,全部加载到内存,读取出来
print(f.readline()) # 打印的是文件第一行的内容
print(f.readlines()) # 把文件内容每行当做一个列表的元素,放到一个列表中,打印的是一个列表
f.close()
2、文件指针
#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Author: Lucky.chen
f = open('aa.txt', encoding='utf-8')
print("第一次读取开始指针位置为%s".center(30, '*') % f.tell())
print(f.readline().strip()) # 打印的是文件第一行的内容
end_tell = f.tell() # 获取当前指针位置
print("第一次读取结束指针位置为%s".center(30, '*') % end_tell)
print("第二次读取开始指针位置为%s".center(30, '*') % f.tell())
print(f.readline().strip())
end_tell = f.tell() # 获取当前指针位置
print("第二次读取结束指针位置为%s".center(30, '*') % end_tell)
# 把指针调节到最开始重新重新读取
f.seek(0) # 把指针调节到最开头
print("重新读取开始指针位置为%s".center(30, '*') % f.tell())
print(f.readline().strip())
end_tell = f.tell()
print("重新读取结束指针位置为%s".center(30, '*') % end_tell)
f.close()
Result:
********第一次读取开始指针位置为0********
I took a pill in Ibiza
********第一次读取结束指针位置为23********
********第二次读取开始指针位置为23********
我在Ibiza岛上嗑药
********第二次读取结束指针位置为47********
********重新读取开始指针位置为0*********
I took a pill in Ibiza
********重新读取结束指针位置为23*********
3、encoding 显示打开文件的编码格式
#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Author: Lucky.chen
f = open('aa.txt')
print(f.encoding)
f.close()
f = open('aa.txt', 'r+', encoding='gbk')
print(f.encoding)
f.close()
Result:
UTF-8
gbk
4、seekable 判断一个文件是否是光标可移动文件,有些二进制文件是无法进行光标移动的。
#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Author: Lucky.chen
f = open('aa.txt', 'r+', encoding='utf-8')
Re = f.seekable()
if Re:
print("Allow Move Cursor")
f.close()
Result:
Allow Move Cursor
5、read() 如果不输入任何参数,读取整个文件,可以跟参数指定读取文件的字节数
#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Author: Lucky.chen
f = open('aa.txt', 'r+', encoding='utf-8')
# 读取三个字节
print(f.read(3))
print("*" * 30)
# 读取50个字节
print(f.read(50))
f.close()
Result:
I t
******************************
ook a pill in Ibiza
我在Ibiza岛上嗑药
To show Avicii I w
6、readable() 判断一个文件是否可读,返回布尔值
#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Author: Lucky.chen
f = open('aa.txt', 'r+', encoding='utf-8')
Re = f.readable()
if Re:
print("File Allow Read!")
else:
print("File Not Allow Read!")
f.close()
print('分割线'.center(30, '*'))
f = open('aa.txt', 'a', encoding='utf-8')
Re = f.readable()
if Re:
print("File Allow Read!")
else:
print("File Not Allow Read!")
f.close()
Result:
File Allow Read!
*************分割线**************
File Not Allow Read!
f.writeble()和上面的一样,是用来测试文件的打开方式是否可读。
7、flush 强制刷新到内存
#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Author: Lucky.chen
# load module
import sys
import time
# 模拟进度条
for i in range(61):
sys.stdout.write('>')
sys.stdout.flush() # flush 强制刷新缓存到内存的数据写入硬盘
time.sleep(0.1)
8、with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open('log','r', encoding='utf-8') as f:
...
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
with open('log1') as obj1, open('log2') as obj2:
pass
例子:比如要修改haproxy.cfg 文件然后还的回滚怎么做?
with open('haproxy.cfg','r') as obj1,open('haproxy.cfg.new','w') as obj2:
for i in obj1.readlines():
i = i.strip()
print i
obj2.write(i)
obj2.write('
')
#读取harpoxy.cfg每行然后存储到新的文件haproxy.cfg.new里!
9、文件遍历
#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Author: Lucky.chen
# load module
f = open("aa.txt", 'r', encoding="utf-8")
for index, line in enumerate(f.readlines()):
# 先把文件内容以行为分割生成列表,数据量大不能用
if index == 5:
print("我是分割线".center(50, '-'))
continue
print(line.strip())
# f.readlines()是把整个文件的每一行当做一个元素,存放在一个列表中,然后循环这个列表就可以了。
# 注:此种方式存在隐患,假如一个文件过大,会把整个内存撑爆
f.close()
f = open("aa.txt", 'r', encoding="utf-8")
count = 0
for line in f:
count += 1
if count == 3:
print("我是第二个分割线".center(50, '-'))
continue
print(line.strip())
f.close()
# 直接for循环后面直接跟文件句炳,此时这个文件句炳是一个迭代器,这样读取是一行一行的读取,内存只会存放一行内容,故而不会涉及内存的问题。
# 两者的优缺点,第一种方法因为是列表,可以直接使用下标,对文件读取那行进行方便控制;第二种方法没有下标,只能自己写计数器,进行判断。