第八章 操作文件

作者: 运维开发_西瓜甜 | 来源:发表于2018-12-25 22:23 被阅读372次

一、 文件操作流程

  1. 打开文件,得到文件的对象(句柄)
  2. 通过文件对象(句柄)操作文件
  3. 保存并关闭文件


二、 Python 中如何实现

python中使用open() 函数来操作文件。

  1. 打开文件,得到文件句柄,并把一个变量名分配给这个文件句柄

变量名 = open('文件路径', '打开模式', encoding = '字符编码')

f_obj = open('a.txt', 'r', encoding='utf-8')
  1. 通过句柄对文件进行操作
data = f_obj.read()
print(data)
  1. 关闭文件
f_obj.close()

字符编码的问题

f=open(...) 是由操作系统打开文件,那么如果我们没有指定编码,那么打开文件的默认编码很明显是操作系统说了算,操作系统会用自己的默认编码去打开文件,默认情况下,在 windows 下是 gbk,在 linux 下是 utf-8

若要保证不乱码,文件以什么方式存储的,就要以什么方式打开。



三、 文件打开模式

打开文件的模式有:

1. 文本方式操作

  • r 只读模式【默认】
  • w 只写模式【不可读;不存在则创建;存在则清空原来的内容再写新内容;】
  • a 追加模式【不可读;不存在则创建;存在则以追加的方式写入新的内容;】

2. 字节方式操作

b 表示以字节的方式操作,不需要编码的参数 encoding

  • rb 字节方式读取
  • wb 字节方式写入,清空原文件内容
  • ab 字节方式的追加写入

注意:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型



四、文件操作

1. 读操作

f_obj = open('./a.txt', 'r')

# 读全部
content = f_obj.read()
print(content)

# 每次读一行
line1 = f_obj.readline()

line2 = f_obj.readline()

line3 = f_obj.readline()


# 一次读完,把每一行的内容放在列表中,成为列表中的一个元素
line_list = f_obj.readlines()

2. 写操作

a. 写普通的文本

f_obj = open('a.txt', 'w')

# 针对文本模式的写,需要自己写换行符
f_obj.write('杨哥\n')
f_obj.write('千锋\n')
f_obj.close()

b. 写 bytes 内容

f_obj = open('b.txt', 'wb')

# 定义 bytes 内容, 两种方式都可以
b1 = bytes('千锋\n', encoding='utf-8')
b2 = '杨哥\n'.encode('utf-8')

# 可以用 writelines() 一次性写入多行
f_obj.writelines([b1, b2])
f_obj.close()

3. 其他方法和属性

f.name                 # 文件名
f.closed               # 文件是否关闭

f.readable()           # 文件是否可读
f.writable()           # 文件是否可写
f.flush()              # 立刻将文件内容从内存刷到硬盘


五、with 语句管理上下文

在实际的编程中,我们会经常忘记关闭已经打开的文件对象,这样就会导致系统资源的浪费。

下面就推荐个保险的办法 :

with open('f1.txt','r', encoding='utf-8') as f:
    content = f.read()
    print(content)
print('此时文件已经自动关闭了')

使用 with 语句来管理上下文 ,操作之后,python 内部会自动关闭并释放文件资源。



六、文件的修改

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果。

  1. 就是先把要修改的文件内容读取到内存中,在内存中修改;
  2. 之后再把修改好的内容先存到一个临时的文件中;
  3. 最后把原来的文件删除,再把临时的文件的文件名修改为原来文件的文件名。

流程解析

"""

1. 把源文件内容 读到内存中
2. 在内存中修改文件的内容

3. 把修改好的文件内容存到另外一个临时的文件中

4. 把原文件删除

5. 把临时文件的文件名修改为 原文件的文件名

"""

# 1. 把源文件内容 读到内存中
with open('a.txt',
          'r',
          encoding='utf-8'
          ) as rf, open(
          '.a.txt.swap',
          'w',
           encoding='utf-8') as wf:

    content = rf.read()

    # 2. 在内存中修改文件的内容
    new_content = content.replace('你好', 'world')

    # 3. 把修改好的文件内容存到另外一个临时的文件中
    wf.write(new_content)

# 4. 把原文件删除
import os
os.remove('a.txt')

# 5. 把临时文件的文件名修改为 原文件的文件名
os.rename('.a.txt.swap', 'a.txt')

Python 中,具体的说有两种实现方式:

注意自己操作的文件的路径、权限、当初用什么编码写入的。比如你是在 Windows 系统下创建并写入的文件,字符编码默认是 gbk

1. 方式一:将硬盘存放的该文件的内容全部加载到内存,进行修改。

import os

with open('a.txt', 'r', encoding='utf-8') as read_f, open(
    '.a.txt.swap','w', encoding='utf-8') as write_f:
        
    r_data=read_f.read()  # 全部读入内存,如果文件很大,会很卡
    w_data=r_data.replace('千锋','千锋教育')  # 在内存中完成修改

    write_f.write(w_data) # 一次性写入新文件

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 

2. 方式二:将硬盘存放的该文件的内容读一行,改一行,存一行。

import os

with open('a.txt', 'r', encoding='utf-8') as read_f,open(
    '.a.txt.swap','w', encoding='utf-8') as write_f:
    for line in read_f:
        line=line.replace('杨哥','yangge')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 

相关文章

  • 《C++ Primer》第||部分读书笔记(第8~12章)

    第八章 ioseamiofsteam文件的操作:https://www.cnblogs.com/likebeta/...

  • 第八章 操作文件

    一、 文件操作流程 打开文件,得到文件的对象(句柄) 通过文件对象(句柄)操作文件 保存并关闭文件 二、 Pyth...

  • 文件操作

    文件操作 目标 文件操作的作用 文件的基本操作打开读写关闭 文件备份 文件和文件夹的操作 一. 文件操作的作用 思...

  • 文件和目录处理相关

    文件和目录处理相关 题: 考点:文件操作/写入操作; 延伸:目录操作函数,其他文件操作; 文件读写操作 文件系统函...

  • 09-文件操作

    一、文件操作流程 a.普通文件操作流程: 打开文件 操作文件 关闭文件 b. json文件操作流程: open(文...

  • VBS文件操作

    VBS文件操作'操作文本文件,操作fso对象(文件对象操作) --------------------------...

  • 文件操作

    文件操作:打开文件、读写文件、操作文件内容 写入文件操作:(把大象装入冰箱)1.打开文件 ...

  • 类的补充

    一.复习 1.文件操作a.操作流程:打开文件(open),操作文件,关闭文件with open() as 文件变量...

  • 文件

    目标 文件操作的作用 文件的基本操作打开读写关闭 文件备份 文件和文件夹的操作 一. 文件操作的作用 思考:什么是...

  • 16总 正则表达式

    复习: 1.文件操作a.操作流程: 打开文件(open) --- 操作文件 --- 关闭文件(close)with...

网友评论

    本文标题:第八章 操作文件

    本文链接:https://www.haomeiwen.com/subject/odeokqtx.html