文件操作
文件
主要内容:
- 文件的介绍
- 文件的操作方法
- 文件的修改方法
文件的介绍
什么是文件?为什么要用文件呢?
文件就是操作系统暴露给用户的一种可以简便操作硬盘的一个接口。人们需要永久的将数据保存到硬盘中,这就需要使用文件来帮忙,简言之就是文件是一种永久保存数据的方式。
文件的操作方法
在Python中,操作文件的方法是内置方法open.
open(file, mode='r', encoding=None),这是open方法常用的三个参数,第一个是文件名,第二参数是文件的打开模式,第三个是打开文件使用的编码方式,默认是操作系统使用的编码方式。这个方法返回的是一个文件对象,或者说是文件的句柄,可以让我们随意操作文件。
下面先说文件的3种打开方式
1. r模式, 文件的只读模式(read only)
2. w模式, 文件的只写模式(write only)
3. a模式, 文件的追加模式(write only)
其中r模式只能读文件内容,当文件不存在时会报错;w模式是只能写文件,当文件不存在时会创建新文件,然后写,文件存在时会覆盖原文件进行写入。a模式当文件不存在时,与w模式一样,当文件存在时,会先定位到文件末尾,然后写入,不会覆盖原文件。
这三种模式后还可以加2种文件单位
1. t 文本模式 默认模式,一般可以省略
2. b 二进制模式 当读取视频文件,图片文件时可以指定该模式。
文件的常用方法
close(): 文件的关闭
open()方法返回的是文件的句柄,是占用了操作系统的资源,Python垃圾回收器回收的只是这个文件的一个引用,并不会回收文件被操作系统打开所占用的资源,所以一般文件要主动关闭以防止资源的浪费。
通常我们不适用close()方法,而是使用文件的上下文管理器with 语句来做到文件的自动关闭。如下所示,不用自动关闭文件。
>>> with open('a.txt') as f:
... print(f.read())
...
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
>>> f.closed
True
readable(),writable(): 返回文件是否可读或可写。
>>> with open('a.txt') as f:
... print(f.readable())
... print(f.writable())
...
True
False
readline(): 读取文件的一行,此处功能与文件的被for循环迭代获取一行功能一样
>>> with open('a.txt') as f:
... for line in f:
... print(line)
...
apple 10 3
tesla 100000 1
>>> with open('a.txt') as f:
... print(f.readline())
... print(f.readline())
...
apple 10 3
tesla 100000 1
seek(offset: int, whence: int = 0): 改变文件指针的位置
seek方法第一个参数是偏移量,可正可负,此处重点是偏移量都是按照字节数计算的,例如utf-8中,一个中文字符就需要偏移3,英文字符需要偏移量按1计算, 第二个参数可取3种值0,1,2 取0的时候是相对于文件开头的偏移量,此时支持文件打开为文本模式或二进制模式。当whence取1的时候,是相对于指针当前的偏移量,但此时只支持文件打开的b模式,取2的时候,是相对于文件末尾的偏移量,此时只支持b模式。
下面是一个利用seek方法实现的简易实时监测文件输入的小程序。
import time
pos = 0
while True:
f = open('test', 'rb')
if pos != 0:
f.seek(pos) # 直接定位到上次的位置
while True:
line = f.readline()
if line.strip():
print(line.strip())
pos += len(line)
if not line.strip():
break
time.sleep(0.1)
f.close()
第二种:
with open('test', 'r', encoding='utf-8') as f:
f.seek(0, 2)
while True:
res = f.readline()
if res:
print(res)
time.sleep(0.1)
truncate(size): 文件的截断,意思是在截断文件指定字节之后的所有内容。
with open('test', 'a', encoding='utf-8') as f:
f.truncate(6)

效果就是截断了后面所有的字符,这个只能在a模式下使用,因为w模式会清空原文件。
文件的修改
方法1:直接一起读出来修改,缺点是浪费内存,当文件很大的时候.
with open('test', 'r', encoding='utf-8') as read_f:
content = read_f.read()
with open('test', 'w', encoding='utf-8') as write_f:
write_f.write(content.replace('中文', '英文'))
方法2: 用一个备份文件,一行一行读原文件,然后直接修改再写入备份文件,最后删除原文件,然后重命名备份文件为原文件,这就相当于修改了原文件。优点就是节省内存,与方法1相比也就是同时存在两份文件,稍微浪费了点硬盘空间。
with open('test', 'r', encoding='utf-8') as read_f, \
open('temp', 'w', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('中文', '英文'))
os.remove('test')
os.rename('temp', 'test')

浙公网安备 33010602011771号