Python学习——Day08

python学习——Day08

文件操作三部曲:

  1. 打开文件
  2. 对文件句柄进行相应的操作
  3. 关闭文件

1.打开文件

f1 = open('e:\文件操作初识.txt', encoding='utf-8',mode='r')
content = f1.read()
print(content)
f1.close()
#更过精彩内容尽在:
#www.xaut.edu.cn
  • open 内置函数, 底层调用的是操作系统的接口.
  • f1 变量,此处叫做文件句柄, 对文件的任何操作. 都必须通过文件句柄. 的方式
  • encoding 可以不写, 不写参数, 默认编码本: 操作系统的默认编码方式(windows默认:gbk; linux默认: utf-8)
  • close 对文件操作结束之后需要将文件关闭, 不然会占用内存

1.错误类型

  • UnicodeDecodeError

image-20200623215220549

错误原因: 文件存储时与文件打开时运用的编码本不一致.

解决方法: 改encoding 中的参数 两者改为一致

  • SyntaxError

  • f1 = open('C:\\Users\\15899\Desktop\文件操作初识.txt', encoding='utf-8',mode='r')
    

image-20200623215751907错误原因: 文件路径(C:\Users\15899\Desktop\文件操作初识.txt)中有'\u',被认为是有特殊含义的字符(类似于\n) ,

解决方法:

法一: 对路径中可能是特殊含义字符处的\进行转义 如下:

​ C:\\Users\\15899\Desktop\文件操作初识.txt

法二: 路径前加r

f1 = open(r'C:\Users\15899\Desktop\文件操作初识.txt', encoding='utf-8',mode='r')

2.文件操作的读

四种模式:r rb r+ r+b

这四种模式都有r模式以下的所有方法!

  • r模式

1.read()--全部读出来 **

f1 = open('文件的读', encoding='utf-8')
content = f1.read()
print(content)
f1.close()
  • 代码中的文件和这个代码文件在同一个文件夹下 可以使用相对路径

2.read(n) --按照字符读取

f1 = open('文件的读', encoding='utf-8')
content = f1.read(7)
print(content)		#知道自己要什么
f1.close()      

3.readline() --按照行读取

f1 = open('文件的读', encoding='utf-8')
print( f1.readline())
print( f1.readline())
print( f1.readline())
f1.close()

结果:

知道自己要什么

别理路旁的傻逼

fighting!

4.readlines()--多行读取

  • 返回一个列表,列表中的每个元素是原文件中的每一行
f1 = open('文件的读', encoding='utf-8')
l1 = f1.readlines()
print(l1)
f1.close()
#['知道自己要什么\n', '别理路旁的傻逼\n', 'fighting!']

5.for --循环读取 ***

f1 = open('文件的读', encoding='utf-8')
for line in f1:
    print(line)
f1.close()

結果:

知道自己要什么

别理路旁的傻逼

fighting!

  • rb模式: 操作的是非文本类文件(图片,视频,音频。)。不需要加encoding参数
f = open('1.jpg', mode='rb')
content = f.read()
print(content)
f.close()

结果:

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00`\x00`\x00\x00\xff\xdb\x00C\x00\x03\x02\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x05\x08\x05\x05\x04\x04\x05\n\x07\x07\x06\x08\x0c\n\x0c\x0c\x0b\n\x0b\x0b\r\x0e\x12\x10\r\x0e\x11\x0e\x0b\x0b\x10\x16\x10\x11\x13\x14\x15\x15\x15\x0c\x0f\x17\x18\x16\x14\x18\x12\x14\x15\x14\xff\xdb\x00C\x01\x03\x04\x04\x05\x04\x05\t\x05\x05\t\x14\r\x0b\r\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14
....

3.文件操作的写

写操作也有 w wb w+ w+b四种模式

  • w模式
f = open('文件操作的写', encoding='utf-8', mode='w')
f.write('不知道应该写啥')
f.close()

结果:

  • 没有文件 , 则在文件夹下生成一个文件, 文件名为:文件操作的写

  • 已经有这个文件,则将文件中原来的内容先清空掉, 再写入新的内容

  • 文件内容为: 不知道应该写啥

  • wb模式

f = open('1.jpg', mode='rb')
content = f.read()
f.close()

f1 = open('2.jpg',mode='wb')
f1.write(content)
f1.close()

结果:首先用rb模式读1.jpg的内容

​ 在创建2.jpg这个文件

​ 最后将读取到的1.jpg的内容写入到2.jpg中

​ 2.jpg中存放着与1.jpg相同的照片

4.文件的追加操作

  • 四种模式: a, ab ,a+ . a+b
f = open('文件的追加',encoding='utf-8', mode='a')
f.write('论文啥时能改好!')
f.close()
  • 没有这个文件就创建这个文件,有这个文件就给里面追加内容

5.文件的其他操作

1.文件的读写操作

f = open('文件的读写操作',encoding='utf-8',mode='r+')
pass
f.close()
FileNotFoundError: [Errno 2] No such file or directory: '文件的读写操作'
  • r+ (读写)模式是不能创建新文件的
f = open('文件操作的读写',encoding='utf-8',mode='r+')
content = f.read()
print(content)
f.write('继续改吧  害')
f.close()

結果:输出为:

论文啥时候能改好
有没有个靠谱的查重软件
淦

但是原文件变为:

论文啥时候能改好
有没有个靠谱的查重软件
淦继续改吧  害

必须要先读后写, 先写后读会出现错误

总结:

文件操作的三个大方向:读,写,追加

  • 读:四种模式:r, rb , r+, r+b
  • 写:四种模式:w,wb,w+,w+b
  • 追加:四种模式:a,ab,a+,a+b

1.tell()

  • 获取光标的位置,单位是字节(一个中文字符是3字节 一个英文字符是一字节,一个符号一字节)
f = open('文件的读',encoding = 'utf-8')
print(f.tell())		#0
content = f.read()
print(f.tell())		#57

读文件之前 光标位置为0 读完之后光标移到57位置(结尾位置)

2.seek()

  • 调整光标的位置
f = open('文件的读',encoding = 'utf-8')
print(f.seek(6))	
content = f.read()
print(content)
f.close()

結果:

6
自己要什么
别理路旁的傻逼
fighting!
  • 将光标位置调整到第6个位置 然后从那里开始读文件

3.flush()

  • 强制刷新 写文件之后可以帮助保存
f = open('文件的其他操作',encoding='utf-8',mode='w')
f.write('sasdada')
f.flush()
f.close()

6.文件的另一种打开方式

with open('文件的读',encoding='utf-8') as f1:
    print(f1.read())

結果:

知道自己要什么
别理路旁的傻逼
fighting!

优点一:

  • 不用手动关闭文件句柄
with open('文件的读',encoding='utf-8') as f1,\
        open('文件操作的写',encoding='utf-8',mode='w') as f2:

    print(f1.read())
    f2.write('sasdada')

优点二:可以一次操作多个文件

7.文件的改操作

  • 现在各个文件管理器对文件改的步骤:
1.以读的模式打开原文件
2.以写的模式创建一个新文件
3.将原文件的内容读出来修改成新内容,写入新文件
4.将原文件删除
5.将新文件重命名成原文件

第一版:

import os
# 1.以读的模式打开原文件
# 2.以写的模式创建一个新文件
with open('文件的改操作',encoding='utf-8',mode='r') as f1,\
    open('文件的改操作2',encoding='utf-8',mode='w') as f2:
#3.将原文件的内容读出来修改成新内容,写入新文件
    old_content = f1.read()
    new_content = old_content.replace('hhh','alex')
    f2.write(new_content)
# 4.将原文件删除
os.remove('文件的改操作')
# 5.将新文件重命名成原文件
os.rename('文件的改操作2','文件的改操作')

进阶版:

import os
# 1.以读的模式打开原文件
# 2.以写的模式创建一个新文件
with open('文件的改操作',encoding='utf-8',mode='r') as f1,\
    open('文件的改操作2',encoding='utf-8',mode='w') as f2:
#3.将原文件的内容读出来修改成新内容,写入新文件
    for line in f1:
        old_line = line.strip()
        new_line = old_line.replace('alex','sb')
        f2.write(new_line)
# 4.将原文件删除
os.remove('文件的改操作')
# 5.将新文件重命名成原文件
os.rename('文件的改操作2','文件的改操作')

然鹅运行结果:文件中的数据变成了一行

有关清空的问题:

首先文件:文件操作的写 这个文件存在 执行如下代码

with open('文件操作的写',encoding='utf-8',mode='w') as f1:
    f1.write('hhh')

文件中原来的内容会被清空,然后写入新内容

但是 文件在关闭之前可以写入好几次而不会清空之前的内容

with open('文件操作的写',encoding='utf-8',mode='w') as f1:
    f1.write('hhh')
    f1.write('hhh')
    f1.write('hhh')

3, 4行的写并不会对第二行已经写入的内容进行清空,因为这时候并没有关闭文件 全部写完后才有了关闭文件的操作

总结:关闭文件句柄,再次以w模式打开此文件时,才会清空原内容

posted @ 2020-06-24 20:05  大明举重冠军  阅读(122)  评论(0)    收藏  举报