文件处理

文件的来源

什么是文件
文件是操作系统提供给用户/应用程序的一种虚拟单位,该虚拟单位直接映射到硬盘空间。

处理文件
用户/应用程序直接操作文件(读/写)就被操作系统转换成具体的硬盘操作,从而实现用户/应用程序将内存中的数据永久保存在硬盘中。

python处理文件的三个步骤

  1. 打开文件,得到文件句柄并赋值给一个变量
    f=open('test.txt','r',encoding='utf-8')
  2. 通过句柄(f)对文件进行操作
    data=f.read()
  3. 关闭文件
    f.close()
    f=open('test.txt','r',encoding='utf-8')过程分析
    _.由应用程序向操作系统发起系统调用open()
    _.操作系统打开该文件,并返回一个文件句柄给应用程序(python解释器)
    _.应用程序将文件句柄赋值给变量f

打开一个文件包含两部分资源:操作系统级打开的文件+应用程序获得的句柄变量。在操作完一个文件时,必须把与该文件的这两部分资源全部回收,为了防止忘记回收,python引入了上下文管理机制。with open()语句会自动帮你回收资源
打开文件时因为只能由操作系统操作,所以打开文件的默认编码会是操作系统的编码,在windows下是gbk,在linux中是utf-8,所以为了不乱码,文件以什么编码存储的,那么就用什么编码打开。

文件操作rtb模式

python处理文件分为两种,分别为打开模式和操作文件内容模式,打开模式默认为r

文件打开模式

以r模式打开文件

with open(r'test.txt',mode='r',encoding='utf-8') as read_f:
    f.read()
    f.readline()
    f.readlines()
    f.readable()

当以r模式打开文件时,获得的文件句柄主要有四个方法。

  1. f.read()
    读取所有内容,光标移动到文件末尾
  2. f.readline
    读取一行内容,光标移动到第二行行首位置
  3. f.readlines()
    读取每一行内容,存放在列表中
  4. f.readable()
    判断文件是否可读
    以w模式打开文件
with open(r'test.txt',mode='w',encoding='utf-8') as f:
    f.write()
    f.writelines()
    f.writeable()

当以w模式打开文件时,获得的文件句柄主要有三个方法。

  1. f.write()
    将内容写入文件
  2. f.writelines()
    一次写入多行内容
  3. f.writeable
    判断文件是否可写
    以a模式打开文件
with open('test.txt',mode='a',encoding='utf-8') as f:
    f.write()
    f.writelines()
1. `f.write()`
将内容追加到文件末尾
2. `f.writelines()`
将多行内容追加到文件末尾
# 操作文件内容的格式
## 打开文件的模式(默认为文本模式)
**r,只读模式【默认模式,文件必须存在,不存在则会抛出异常】**
**w,只写模式【不可读;不存在则创建新文件;存在则清空内容】**
**a,追加写模式【不可读;不存在则创建新文件;存在则只追加内容】**
## 对于非文本文件,我们只能用使用b模式,'b'表示以字节的方式操作(而所有文件都是以字节的形式存储的,使用'b'模式无需考虑文件的字符编码)
**注意:以b方式打开文件时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码**
## 其他模式
**"+" 表示可以同时读写某个文件**
**r+, 读写【可读,可写】**
**w+,写读【可读,可写】**
**a+, 写读【可读,可写】**


**x, 只写模式【不可读;不存在则创建,存在则报错】**
**x+ ,写读【可读,可写】**

# 文件内指针移动

## 一: read(3):

  1. 文件打开方式为文本模式时,代表读取3个字符

  2. 文件打开方式为b模式时,代表读取3个字节

## 二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

注意:

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

# 文件的修改
**文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,原理是把硬盘中的文件读入内存,在内存中修改完后,覆盖原来的内容。具体的说有两种实现方式:**

## 方式一:
**将硬盘存放该文件的内容全部加载到内存,修改完毕后,再由内存覆盖到硬盘中**

import os

with open('test.txt') as read_f,open('.a.txt.swap','w') as write_f:
data=read_f.read() #全部读入内存,如果文件很大,会很卡
data=data.replace(') #在内存中完成修改

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

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

## 方式二:
**将硬盘存放的文件一行一行读入到内存,修改完毕后就写入新文件,最后用新文件覆盖源文件**

import os
with open('test.txt') as read_f,open('.test.txt.swap','w') as write_f:
for line in read_f:
line = line.replace()
write_f.write(line)

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

原文地址:https://www.cnblogs.com/zuanzuan/p/9686922.html