python-文件操作

第五章 文件操作

文件操作的初识:

  • 文件路径:path

  • 打开方式:读,写,追加,读写,写读等等

  • 编码方式:utf-8,gbk,gb2312,建议用utf-8

5.1 文件的基本操作

  • 打开文件 open()

  • 对文件句柄的相应操作

  • 关闭文件 close()

# 打开文件
f = open('log.txt',mode='r',encoding='utf-8')
# 读取文件(操作)
content = f.read()
print(content)
# 关闭文件
f.close()
obj = open('路径',mode='模式',encoding='编码')
obj.write()只写
obj.read()只读
obj.close()关闭文件

5.2 代码解释

'''
open()内置函数,open底层调用的是操作系统的接口
f1,变量,f1,fh,file_handler,f_h,文件句柄。 对文件进行的任何操作,都得通过文件句柄. 的方式。
encoding:可以不写,不写参数,默认编码本:操作系统的默认的编码
windows: gbk。
linux: utf-8.
mac : utf-8.
f1.close() 关闭文件句柄。
'''

5.3 打开模式【读,写,追加】

5.3.1 读 r ,r+ , rb ,r+b
  • rb:操作的是非文本的文件,图片,视频,音频

  • read()【只读(全部读取)】

obj = open('路径',mode='模式',encoding='编码')
obj.read()只读
obj.close()关闭文件
  • readline()【读取第一行,返回一个字符串】

obj = open('路径',mode='模式',encoding='编码')
obj.readline()
obj.readline()【一行一行读】
obj.close()关闭文件
  • readlines()【读取每一行,返回一个列表,列表中的每个元素是源文件的每一行。】

obj = open('路径',mode='模式',encoding='编码')
obj.readlines()
obj.close()关闭文件


f = open('文件的读', encoding='utf-8')
l1 = f.readlines()
for line in l1:
print(line)
# print(l1)
f.close()
  • read(n)【按字符读取】

f = open('文件的读', encoding='utf-8')
content = f.read(5) # 5个字符
print(content)
f.close()
  • rb

f = open('美女.jpg',mode='rb')
content = f.read()
print(content)
f.close()

obj = open('a.txt',mode='rb')
data = obj.read(1) # 1个字节
obj.close()
  • r+ 【可读可写】

    • 读:默认从0的光标开始读,也可以通过 seek 调整光标的为位置。

    • 写:从光标所在的位置开始写,也可以通过 seek 调整光标的位置。

读并追加 # 顺序不能错误。
f = open('文件的读写', encoding='utf-8', mode='r+')
content = f.read()
print(content)
f.write('人的一切痛苦,本质都是对自己无能的愤怒。')
f.close()
5.3.2 写 w,wb, w+,w+b
  • w+

  • 读:默认光标永远在写入的最后或0,也可以通过 seek 调整光标的位置。

  • 写:先清空。

# 没有文件,创建文件,写入内容
f = open('文件的写',encoding='utf-8',mode='w')
f.write('随便写一点')
f.close()

如果文件存在,先清空原文件内容,再写入新内容
f = open('文件的写',encoding='utf-8',mode='w')
f.write('太白最帅....')
f.close()

# wb
f = open('美女.jpg',mode='rb')
content = f.read()
# print(content)
f.close()

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

5.3.3 追加

a, ab, a+,a+b 四种模式

a+

  • 读:默认光标在最后,也可以通过 seek 调整光标的位置。然后再去读取。

  • 写:永远写到最后。

# 读并追加 # 顺序不能错误。
# f = open('文件的读写', encoding='utf-8', mode='r+')
# content = f.read()
# print(content)
# f.write('人的一切痛苦,本质都是对自己无能的愤怒。')
# f.close()

# 错误示例:
# f = open('文件的读写', encoding='utf-8', mode='r+')
# f.write('人的一切痛苦,,,本质都是对自己无能的愤怒,,,')
# content = f.read()
# print(content)
# f.close()

5.3.4 方法

  • tell()获取光标的位置 单位字节。

f = open('文件的读写', encoding='utf-8')
print(f.tell())
content = f.read()
# print(content)
print(f.tell())
f.close()
  • seek 调整光标的位置,无论模式是否带b,都是按照字节进行处理。

f = open('文件的读写', encoding='utf-8')
f.seek(7)
content = f.read()
print(content)
f.close()
  • flush 强制刷新,强制将内存中的数据写入到硬盘

f = open('文件的其他功能', encoding='utf-8',mode='w')
f.write('fdshdsjgsdlkjfdf')
f.flush()
f.close()

5.3.5 另一种打开方式

# 优点1: 不用手动关闭文件句柄
# with open('文件的读',encoding='utf-8') as f1:
# print(f1.read())
# 优点2:
with open('文件的读', encoding='utf-8') as f1,\
open('文件的写', encoding='utf-8', mode='w')as f2:
print(f1.read())
f2.write('hfdsjkghkajhsdjg')
  • 缺点:这里要注意一个问题,虽然使用with语句方式打开文件,不用你手动关闭文件句柄,比较省事儿,但是依靠其自动关闭文件句柄,是有一段时间的,这个时间不固定,所以这里就会产生问题,如果你在with语句中通过r模式打开文件,那么你在下面又以a模式打开文件,此时有可能你第二次打开文件时,第一次的文件句柄还没有关闭掉,可能就会出现错误,他的解决方式只能在你第二次打开此文件前,手动关闭上一个文件句柄。

5.3.6 文件修改

  • 文件操作改的流程: 1, 以读的模式打开原文件。 2,以写的模式创建一个新文件。 3,将原文件的内容读 出来修改成新内容,写入新文件。 4,将原文件删除。 5,将新文件重命名成原文件。

import os
# 1, 以读的模式打开原文件。
# 2,以写的模式创建一个新文件。
with open('alex自述',encoding='utf-8') as f1,\
open('alex自述.bak',encoding='utf-8',mode='w') as f2:
# 3,将原文件的内容读出来修改成新内容,写入新文件。
old_content = f1.read()
new_content = old_content.replace('alex', 'SB')
f2.write(new_content)
os.remove('alex自述')
os.rename('alex自述.bak','alex自述')
import os
# 1, 以读的模式打开原文件。
# 2,以写的模式创建一个新文件。
with open('alex自述',encoding='utf-8') as f1,\
       open('alex自述.bak',encoding='utf-8',mode='w') as f2:
# 3,将原文件的内容读出来修改成新内容,写入新文件。
   for line in f1:
# 第一次循环 SB是老男孩python发起人,创建人。
  new_line = line.replace('SB', 'alex')
f2.write(new_line)
os.remove('alex自述')
os.rename('alex自述.bak','alex自述')
# 有关清空的问题:
# 关闭文件句柄,再次以w模式打开此文件时,才会清空。
# with open('文件的写', encoding='utf-8',mode='w') as f1:
# for i in range(9):
# f1.write('恢复贷款首付款')
 
posted @ 2021-03-25 21:20  Jack_Gao  阅读(103)  评论(0)    收藏  举报