文件操作

读操作

一.只读

美女模特空姐护士联系方式.txt

文件路径: D:\美女模特空姐护士联系方式.txt 编码:utf-8,gbk,gb2312.... 模式:只读,只写,追加,写读,读写....

使用open()来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了

打开文件的方式:

  r,w,a

  r+,w+,a+

  rb,wb,ab

  r+b,w+b,a+b

r模式

f = open('美女模特空姐护士联系方式.txt',mode='r',encoding='utf-8')
content = f.read()
print(content)
f.close()

结果:
标题很好

open中第一个参数放入的是要打开的文件名字,第二个参数是要对这个文件进行的操作,第三参数是用什么编码方式打开文件中的内容.

f 可写成任意变量等,它被称作:文件句柄,文件操作符,或者文件操作对象等。 open 是Python调用的操作系统(windows,linux,等)的功能,而windows的默认编码方式为gbk,linux默认编码方式为utf-8,所以你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8。 mode为打开方式:常见的有r,w,a,r+,w+,a+.rb,wb,ab,等,默认不写是r。 流程就是打开文件,产生一个文件句柄,对文件句柄进行相应操作,关闭文件。

rb 模式

r只读,rb只读字节

f = open('护士少妇萝莉',mode='rb')
content = f.read()
print(content)
f.close()

结果:
b'\xe6\xa0\x87\xe9\xa2\x98\xe5\xbe\x88\xe5\xa5\xbd'

rb 读出来的数据是bytes类型,在rb模式下,不能encoding字符集

rb的作用:在读取非文本文件的时候,比如要读取mp3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的,这个字节的模式是用于传输和存储。

二.路径

相对路劲

就是相对于某个文件来说,进行路劲查找,以上代码是相对于运行的文件

绝对路径

绝对路径是从咱们电脑的磁盘开始查找

一.写模式

覆盖写

刷新flush()

f = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
f.write('太白很白')
f.flush()
f.close()

结果:
当我选择使用w模式的时候,在打开文件的时候就就会把文件中的所有内容都清空,然后在操作

注意点:如果文件不存在使用w模式会创建文件,文件存在w模式是覆盖写,在打开文件时会把文件中所有的内容清空.

f1 = open('../path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f1.read()
print(msg)

# 这个是先查看小娃娃文件中有哪些内容


f = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
f.write('太白很白')
f.flush()
f.close()
# 这个是对小娃娃文件进行覆盖写操作


f1 = open('../path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f1.read()
print(msg)

# 查看覆盖写后的内容

尝试读一读

f1 = open('../path1/小娃娃.txt',mode='w',encoding='utf-8')
msg = f1.read()
print(msg)

结果:
Traceback (most recent call last):
  File "D:/python_object/path2/test.py", line 563, in <module>
    msg = f1.read() 
io.UnsupportedOperation: not readable    #模式是w,不可以执行读操作

wb模式下,不可以指定打开文件的编辑,但是写文件的时候必须将字符串转换成utf-8的bytes数据

f = open('../path1/小娃娃.txt',mode='wb')
msg = '你好'.encode('utf-8')
f.write(msg)
f.flush()  # 刷新
f.close()

追加

只要是a或者ab,a+都是在文件的末尾写入,不论光标在任何位置.

在追加模式下,写入的内容后追加在文件的末尾

a模式如果文件不存在就会创建一个新文件

f1 = open('../path1/小娃娃.txt',mode='a',encoding='utf-8')
msg = f1.write('这支烟灭了以后')

+模式

读写模式

对于读写模式,必须是先读后写,因为光标默认在开头位置,当读完了以后再进行写入.使用频率最高的模式就是r+

r+模式

看下正确的操作:

f1 = open('../path1/小娃娃.txt',mode='r+',encoding='utf-8')
msg = f1.read()
f1.write('这支烟灭了以后')
f1.flush()
f1.close()
print(msg)
结果:
正常的读取之后,写在结尾

看下错误的操作:

f1 = open('../path1/小娃娃.txt',mode='r+',encoding='utf-8')
f1.write('小鬼')
msg = f1.read()
f1.flush()
f1.close()
print(msg)

结果:
这样写会把小鬼写在开头,并且读出来的是小鬼之后的内容

r+模式一定要记住是先读后写

r+模式坑

深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入 或者操作文件的时候都是在结尾进行的操作.

写读模式

先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用

f1 = open('../path1/小娃娃.txt',mode='w+',encoding='utf-8')
f1.write('小鬼')
msg = f1.read()
f1.flush()
f1.close()
print(msg)

w+模式下 其实和w模式一样,把文件清空了,在写的内容.

追加读(a+,a+b)

a+模式下,不论是先读还是后读,都是读不到数据的

f = open('../path1/小娃娃.txt',mode='a+',encoding='utf-8')
f.write('阿***')
f.flush()
msg = f.read()
f.close()
print(msg)

一.其他相关操作

seek()

seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数

通常使用seek都是移动到开头或者结尾

移动到开头:seek(0,0)

移动到当前位置:seek(0,1)

移动到末尾:seek(0,2)

移动1个字:seek(3) 移动光标是按照字节进行移动

f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close() 
tell()

tell()

使用tell()可以获取当前光标在什么位置

f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中⽂文3 * 3个 = 9
print(f.tell()) # 光标位置9
f.flush()
f.close()

修改文件

文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字.

import os
with open("../path1/小娃娃", mode="r", encoding="utf-8") as f1,\
open("../path1/小娃娃_new", mode="w", encoding="UTF-8") as f2:
    content = f1.read()
    new_content = content.replace("冰糖葫芦", "⼤白梨")
    f2.write(new_content)
os.remove("../path1/小娃娃") # 删除源文件
os.rename("../path1/小娃娃_new", "小娃娃") # 重命名新文件

弊端: ⼀次将所有内容进行读取. 内存溢出. 解决方案: 一行一行的读取和操作
import os
with open("小娃娃", mode="r", encoding="utf-8") as f1,
open("小娃娃_new", mode="w", encoding="UTF-8") as f2:
for line in f1:
new_line = line.replace("大白梨", "冰糖葫芦")
f2.write(new_line)
os.remove("小娃娃") # 删除源⽂文件
os.rename("小娃娃_new", "小娃娃") # 重命名新文件

posted @ 2019-07-15 19:42  天之坚毅  阅读(124)  评论(0编辑  收藏  举报