Python基础之文件操作
目录:
1.文件操作的介绍
2.文件操作的读
3.文件操作的写
4.文件操作的追加
5.文件操作的其他模式
6.文件操作的其他方法
7.文件操作的另一种方式
8.文件操作的改
1.文件操作的介绍
-
引子
前提:假如世界上所有可以操作文件的软件全部都消失了,此时!超子qq收到了一个消息:明子给其发了一个消息,是一个文件;护士空姐老师的联系方式
.text
发给了超子,没有任何其他软件,超子说,我学过python,我可以自学,我用python写一个简单的软件看看能不能打开这个文件。我们必须要知道的几个参数是什么?文件操作的三要素:
# 编码方式 encoding: gbk, utf-8 gb2312 .... # 文件路径 path: 这个文件到底存放在计算机的哪个位置。 # 操作模式 mode: 读,写,读写,写读...
-
简单测试
# 1. 打开文件产生文件句柄 f = open('/Users/barry/Desktop/空姐护士老师联系方式.text', mode='r', encoding='utf-8') # 2. 操作文件句柄 content = f.read() print(content) # 3. 关闭文件句柄 f.close()
相关参数解释
""" open() python中的内置函数,用于打开文件进行文件操作的。底层调用的操作系统操作文件的接口。 mode:操作方式 r w a r+ w+ rb..... encoding: 不是具体指编码,声明操作此文件的编解码方式。 f: 变量,这个变量有点儿特殊,获取的open函数的返回值,我们称之为文件句柄,f fh file_hanlder. close(): 关闭文件句柄,在内存中将文件句柄销毁。 """
-
错误一
路径错误:我们的路径是字符串的形式,其中你的路径里面的路径分隔符\与后面的字符可能产生的特殊的意义。
解决方式:
# 方式一:'//Users/barry/Desktop/少妇空姐护士联系方式.text' # 方式二:r'/Users/barry/Desktop/少妇空姐护士联系方式.text' 告知解释器这个字符串里面所有的/都代表路径分隔符, # 不要与后面的字符产生特殊意义。
-
错误二
编码错误,文件当时使用的编码与你操作文件定义的编码不一致。
解决方式:尝试不同的编码方式,utf-8 gbk 如果还不行,查看你当时创建文件的那个软件,他有默认设置。
2.文件操作的读
- 文件操作的读:
r rb r+ r+b
模式。
2.1 r模式
-
read
方法全部都读取出来
f = open('test', mode='r', encoding='utf-8') content = f.read() print(content) f.close()
-
read(n)
按照指定的字符读取
f = open('test', mode='r', encoding='utf-8') content = f.read(3) print(content) f.close()
-
readline
每次读取一行。
f = open('test', mode='r', encoding='utf-8') print(f.readline()) print(f.readline()) print(f.readline()) f.close()
-
readlines
返回一个列表,列表里面的每个元素都是字符串类型,内容为原文件的每一行数据。
f = open('test', mode='r', encoding='utf-8') lst = f.readlines() print(lst) f.close()
-
for
循环遍历f = open('test', mode='r', encoding='utf-8') # f 文件句柄他是一个迭代器,他的特性是:每次循环,加载到内存中一行, # 再次循环,上一行内容在内存中消失,下一行内容加载到内存,每次只是占内存一行。 for line in f: print(line.strip(), type(line)) f.close()
2.2 rb模式
-
读取文件,读取文件读出来的数据为字节序列,rb模式一般操作的是非文字类的文件,图片,视频,音频。
f = open('test', mode='rb') # print(f.read()) # 一般不for遍历读取rb模式。 for line in f: print(line) f.close() # rb模式一般操作的是非文字类的文件。 f = open('mn.png', mode='rb') print(f.read()) f.close()
3.文件操作的写
- 文件操作的写:
w wb w+ w+b
模式。
3.1 w模式
-
没有文件,创建文件,写入内容。
f = open('testw', encoding='utf-8', mode='w') f.write('随便写一点...') f.close()
-
有文件,清空文件内容,写入新内容。
f = open('testw', encoding='utf-8', mode='w') f.write('宇超怎么老犯困呀?') f.close()
3.2 wb模式
-
以字节序列的数据写入文件,一般操作与非文字类文件。图片,视频,音频。
f = open('mn.png', mode='rb') pic_content = f.read() f.close() f2 = open('mn2.png', mode='wb') f2.write(pic_content) f2.close()
4.文件操作的追加
-
文件操作的追加:
a ab a+ a+b
-
没有文件,创建文件,写入内容。
f = open('testa', encoding='utf-8', mode='a') f.write('宇超怎么老犯困呀?') f.close()
-
有文件,在原文件后面追加新内容。
f = open('testa', encoding='utf-8', mode='a') f.write('王硕默写的还可以挺好,但是荣轩默写不行') f.close()
5.文件操作的其他模式
-
+
在原有的基础上,增加一个新的功能。 -
r+模式 读写模式,先读,后写。
# f = open('test', mode='r', encoding='utf-8') # print(f.read()) # f.write('6666') # f.close() f = open('test', mode='r+', encoding='utf-8') print(f.read()) f.write('6666') f.close()
-
w+
自己测试
6.文件操作的其他方法
-
方法就是文件句柄可以调用的方法:
read readline readlines write
-
tell
与seek
tell
就是获取光标的位置,seek
设置光标的位置。f = open('test', mode='r', encoding='utf-8') # print(f.tell()) # 最开始光标在0的位置 f.read(3) print(f.tell()) # 获取光标的位置 f.close() # seek f = open('test', mode='r', encoding='utf-8') # print(f.tell()) # 最开始光标在0的位置 # f.read(3) # print(f.tell()) # 获取光标的位置 f.seek(10) print(f.read()) f.close() # seek(0,2) 调整到光标的最后 f = open('test', mode='r', encoding='utf-8') f.seek(0,2) print(f.tell()) f.close()
-
readable
writabe
判断文件句柄是否可读,是否可写。
f = open('test', mode='r', encoding='utf-8') # f.seek(0,2) # print(f.tell()) print(f.readable()) print(f.writable()) f.close()
-
flush
刷新,强制保存。
f = open('test', mode='w', encoding='utf-8') f.write('旋哥很厉害') f.flush() f.close()
7.打开文件的另一种方式
-
with open('test', mode='r', encoding='utf-8') as f1: print(f1.read()) # f1.close() with语句会自动的关闭文件句柄。(有时间延迟) # 一个with语句可以同时操作多个文件,产生多个文件句柄。 with open('test', mode='r', encoding='utf-8') as f1, \ open('testa', mode='w', encoding='utf-8') as f2: print(f1.read()) f2.write('fdjsalfdjsafjdksalf')
8.文件操作的改
-
前提
世界上所有的操作文件的软件,如果涉及到修改文件里面的内容,离不开下面的这5步:
- 以读的模式打开原文件。
- 以写的模式打开一个新文件。
- 将原文件的内容读到内存进行修改形成新内容写入新文件。
- 将原文件删除。
- 将新文件重命名成原文件。
-
low
版import os # + 以读的模式打开原文件。 # + 以写的模式打开一个新文件。 with open('person', encoding='utf-8', mode='r') as f1,\ open('person.bak', encoding='utf-8',mode='w') as f2: # + 将原文件的内容读到内存进行修改形成新内容写入新文件。 old_content = f1.read() new_content = old_content.replace('太白金星', 'barry') f2.write(new_content) # + 将原文件删除。 os.remove('person') # + 将新文件重命名成原文件。 os.rename('person.bak', 'person')
-
高大上版
import os # + 以读的模式打开原文件。 # + 以写的模式打开一个新文件。 with open('person', encoding='utf-8', mode='r') as f1,\ open('person.bak', encoding='utf-8',mode='w') as f2: # + 将原文件的内容读到内存进行修改形成新内容写入新文件。 for old_line in f1: new_line = old_line.replace('barry', '太白') # 'barry是靓仔。' ---> '太白是靓仔.' f2.write(new_line) # + 将原文件删除。 os.remove('person') # + 将新文件重命名成原文件。 os.rename('person.bak', 'person') # #------------------ with open('testa',encoding='utf-8',mode='w') as f1: f1.write('1111') f1.close() with open('testa',encoding='utf-8',mode='w') as f2: f2.write('2222') f2.close() with open('testa',encoding='utf-8',mode='w') as f3: f3.write('1111') f3.write('2222') f3.write('11311') f3.write('11543511') f3.write('11543511') f3.write('43675') f3.coose()