文件处理
打开文件
先假设我们在文件中出来现在已经有的.py文件还有一个叫text.txt的文件。
open
语法:open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
open中参数众多,但是我们常用的参数也就只有file,mode和encoding,接下来我们就来介绍一下这几个参数的作用
file
文件名或路径,这是open的必填参数,如果调用open最少你要说清你要打开那个文件。
路径小知识:在Windows系统中路径的分割使用的是\但是\在Python中是转义字符,所以我们可以使用\来讲\转义成普通\,或使用f’'格式化字符串,或使用/来分割路径,因为咋Linux系统中路径的分割就是使用/进行的。
open(text.txt)
mode
文件打开模式,先来介绍参数,参数具体用法会在操作文档的时候具体介绍
模式 | 功能 |
---|---|
r | 只读模式(如果不填写,则默认就是此模式) |
w | 覆盖写入模式(如果存在和写入文件同名文件则覆盖,不存在则新建) |
x | 新建文件写入模式(如果存在和写入文件同名文件则报错,不存在则新建) |
a | 追加写入模式(如果存在和写入文件同名文件则在文件内容后追加,不存在则新建) |
b | 二进制读取模式,此模式可以读取除纯文本之外的其他文件 |
t | 文本模式(默认打开模式) |
+ | 扩展模式,可以扩展上述的模式,但必须要配合使用,比如:r+就扩展了只读模式,让这个模式既可读又可写 |
encoding
文件的编码格式,如果不填写就只能读取ASCII格式的文件,读取中文的文件就会报错,如果想要读取中文,一般常用UTF-8。
操作文件
读取文档
逐个读取read
语法:文件对象.read(size = -1)
-
read()默认值是-1,会自动读取到最后一个值
-
可以给read指定一个值,read每次读取都会从上次读取结束的位置开始。换行符也算一个字符。
-
如果read指定的读取数量大于实际数量,这会读取所有文件。如果没有内容,会返回一个‘’空串
逐行读取
语法:文件对象.readline()
每次读取一行内容。
语法:文件对象.readlines()
一行一行读取,并且会把每行内容自动封装到列表中。
文件读取位置
- tell()可以用来返回当前读取到的位置
- seek(参数1,参数2)可以修改当前读取的位置
- 参数1用于指定读取位置。
- 第二个参数为从哪开始指定位置
- 第二个参数接收:0从头开始计数(默认),1从当前位置开始计数,2从最后位置开始计数。
- 第二个参数只能在b模式下改变。在b模式下seek参数一代表的为字节,在utf-8中一个中文字符等于三个字节
写入文档
write
语法:文件对象.write(写入内容)
当文档处于w、x、a等写入模式的情况下才能使用write,否则会报错
write写入内容时会将写入的字数作为返回值返回
data = open('text.txt', 'w', encoding='utf-8')
name = '我是寻觅'
data1 = data.write(name)
print(data1) # 4
关闭文件
close
语法:文件对象.close
将使用完的文件及时关闭,能有利于提升程序性能。
with… as…
使用这个函数打开文件使用完后会自动关闭,让代码变得更简洁
语法:with open() as 变量:
with open('text.txt', 'w') as data:
name = 'My name xun_mi'
data.write(name)
实例
操作音乐文件
with open('三无MarBlue - 童话镇(Cover 暗杠).mp3', 'rb') as music:
r = 1024*100
data = music.read(r)
with open('裁剪出的童话镇.mp3', 'wb') as new:
new.write(data)
with open('三无MarBlue - 童话镇(Cover 暗杠).mp3', 'rb') as data:
while True:
r = data.read(1024*1000)
if r == b'':
break
with open('新裁剪出的童话镇.mp3', 'ab') as new:
new.write(r)
os模块
os模块是Python中一个内置的用来操作文件的模块
下面我们来介绍一些常用方法。
方法 | 功能 |
---|---|
os.listdir(‘路径,默认文件所在路径’) | 读取指定路径目录结构并作为返回值返回 |
os.getcwd() | 读取当前文件所在目录并作为返回值返回 |
os.chdir ('路径‘’) | 用来改变文件当前所在路径 |
os.mkdir(‘目录名’) | 创建目录 |
os.rmdir(‘目录名’) | 删除目录(只能删除空目录,非空目录会报错) |
os.makedirs('目录名’) | 生成多层目录 |
os.removedirs('目录名’) | 删除多层空目录(只能删除空目录,非空目录会报错) |
os.rename('原目录名‘,'新目录名’) | 目录重命名 |
os.stat(‘目录名或文件名’) | 读取目录或文件信息 |
os.name | 判断当前系统信息,如果是Windows则返回nt,Linux则返回posix |
os.environ | 获取系统变量 |
os.system('命令语句’) | 运行shell命令 |
import os
# listdir读取指定路径目录结构
data = os.listdir('.')
print(data)
# getcwd读取当前文件所在目录
data = os.getcwd()
print(data)
# mkdir创建目录
os.mkdir('我是os模块创建的目录')
# chdir用来改变文件当前所在路径
os.chdir('./我是os模块创建的目录')
data = os.getcwd()
print(data)
# rmdir删除一层目录
os.rmdir('我是os模块创建的目录')
# makedirs生成多层目录
os.makedirs('我是os创建的多层目录\\第二层')
# removedirs删除多层空目录
os.removedirs('我是os创建的多层目录')
# rename重命名文件
os.rename('我是os模块创建的目录', '我是经过重命名的文件')
# stat获取文件或目录信息
data1 = os.stat('我是os创建的多层目录')
data2 = os.stat('os模块.py')
print(data1, data2)
# name输出当前运行系统环境Windows为nt,Linux为posix
data = os.name
# environ获取系统变量(发现了有部分中文乱码情况,但只是部分乱码,很奇怪)
data = os.environ
# system运行shell命令(发生中文乱码情况,这是字符编码问题,默认字符编码是GBK这个中文编码,但是很奇怪会乱码。解决方案1.使用chcp 65001将编码改变成utf-8)
os.system('chcp 65001')
os.system('dir')