-
引子
前提:假如世界上所有可以操作文件的软件全部都消失了,此时!宇超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 如果还不行,查看你当时创建文件的那个软件,他有默认设置。
文件操作的读,r rb r+ r+b模式。
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()
读取文件,读取文件读出来的数据为字节序列,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()
文件操作的写
文件操作的写,w wb w+ w+b模式。
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()
以字节序列的数据写入文件,一般操作与非文字类文件。图片,视频,音频。
f = open('mn.png', mode='rb')
pic_content = f.read()
f.close()
f2 = open('mn2.png', mode='wb')
f2.write(pic_content)
f2.close()
文件操作的追加
文件操作的追加: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()
+在原有的基础上,增加一个新的功能。
-
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+ 自己测试。
方法就是文件句柄可以调用的方法: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()
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')
文件操作的改
-
前提
世界上所有的操作文件的软件,如果涉及到修改文件里面的内容,离不开下面的这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 f1: # f1.write('2222') # f1.close() with open('testa',encoding='utf-8',mode='w') as f1: f1.write('1111') f1.write('2222') f1.write('11311') f1.write('11543511') f1.write('11543511') f1.write('43675')



