1、常用的文件分类
配置文件
数据文件
日志文件
数据库文件
声音和图像文件
这节主要是为了讲用python来处理文件
2、文件的读取
文件读取的过程:
1、打开文件 2、读取文件 3、关闭文件
r : read
w : write
a+ : 读写
# 文件读取的过程 1、打开文件 2、读取文件 3、关闭文件
# r : read
# w : write
# a+ : 读写
file = open('data.txt', 'r')
print(file.readable()) # 判断这个文件能不能被读取
print(file.writable()) # 判断是否可写
file.close() # 关闭文件
读取文件名为data的文件
file = open('data.txt', 'r')
data = file.read()
print(data)
file.close() # 关闭文件
(只以w的方式打开时,文件内容会被清空)
若文件太大,则这种方式不可取,采用带参的调用方式
2.1 read后面加5,表示只读取5个字符
file = open('data.txt', 'r')
data = file.read(5)
print(data)
file.close() # 关闭文件
2.2 file.seek(6) 表示跳过前6个字符
file = open('data.txt', 'r')
file.seek(6)
data = file.read(6)
print(data)
file.close() # 关闭文件
跳过前6个字符,且只读6个字符
2.3 按行读取 file.readline()
(读取第一行)
file = open('data.txt', 'r')
data = file.readline()
print(data)
file.close()
想读取全部内容
(while循环,空字符串认为是false)
file = open('data.txt', 'r')
data = file.readline()
while data:
print(data)
data = file.readline()
file.close()
print里面跟end=’’ 可使其不会自动换行
print(data, end='')
2.4 datas()一次读取全部行再处理,采用遍历列表
file = open('data.txt', 'r')
datas = file.readlines()
print(type(datas))
for line in datas:
print(line, end='')
file.close()
相对路径是直接输入txt文件名,绝对路径需要输入磁盘路径
(与转义字符相配合,所以是2个右斜杠)
(绝对路径就是从盘符开始的路径,相对路径是软件或者网页编程的概念,是指程序与其他文件的相对路径)
# 相对路径 绝对路径
file = open('e:\\data.txt', 'r')
data = file.read()
print(data)
file.close()
也可以只用一个反斜杠/来表示
file = open('e:/data.txt', 'r')
也可以在前面加一个r,代表里面的 \ 已经不能代表转义字符来处理了
file = open(r'e:\data.txt', 'r')
2.5 一种更加安全的方式
若语句中出错,则最后一行关闭文件的命令就无法执行,为了避免这种情况,采用with语句,相当于它会执行finally语句,帮我们把文件关闭掉
(读和写都可)
with open('data.txt', 'r') as file:
datas = file.readlines()
print(type(datas))
for line in datas:
print(line, end='')
2.6 读取配置文件
文件读取一个常用的场景,读取配置文件
比如说,配置一个app.config文件
然后读取
configData = {} # 定义一个字典
with open('app.config', 'r') as file:
datas = file.readlines()
for line in datas:
if line.startswith("#"):
continue # 跳过注释语句
key = line.split("=")[0] # 按等号分割 0表示第一个元素
value = line.split("=")[1] # 按等号分割 1表示第二个元素
configData[key] = value
if __name__ == '__main__': # 最后两行是测试代码,只有在当前程序运行的时候才会打印configData
print(configData)
读取结果有换行符
为了取消可以在value语句后面加replace()
value = line.split("=")[1].replace("\n", "") # 将换行符替换为空字符串
新建一个.py文件,调用所写的appConfig.py文件
from ch9.appConfig import configData
print('数据库地址:', configData['db_url'])
print('数据库端口:', configData['db_port'])
print('数据库用户:', configData['db_user'])
print('数据库密码:', configData['db_pass'])
3、文件的写入
w是先清空文件再写入
也要有打开文件、写入文件、关闭文件三个步骤
但是使用with语句就不用关闭文件语句‘
with open('data_write', 'w') as file:
data = 'hello python'
file.write(data)
但是使用这个写入文件时不会自动帮助你换行,需要在第一行后面加一个换行符
with open('data_write', 'w') as file:
data = 'hello python'
file.write(data+'\n')
data = 'i am ccc'
file.write(data)
3.1 写入多行
使用循环
with open('data_write', 'w') as file:
datas = ['hello python', 'i am ccc', 'like plmm']
for data in datas:
file.write(data+'\n')
使用writelines
(但是没有换行)
with open('data_write', 'w') as file:
datas = ['hello python', 'i am ccc', 'like plmm']
file.writelines(datas)
为了换行采用推导式生成新的列表
with open('data_write', 'w') as file:
datas = ['hello python', 'i am ccc', 'like plmm']
file.writelines([data+'\n' for data in datas])
但是这种办法会让结果多一行,可能会给你的程序带来麻烦,为了解决这个问题,用join字符串连接的方式生成一个新的字符串,这样就会解决多一行的问题
with open('data_write', 'w') as file:
datas = ['hello python', 'i am ccc', 'like plmm']
file.writelines("\n".join(datas))
最后一行只用write参数也可以
file.write("\n".join(datas))
(这样看来writelines不光可以接受列表的参数,同样可以接受一个字符串作为参数,而一个字符串作为参数是write方法的本职工作)
已知w是先清空文件再写入,那么想从文件的末尾接着写入应该怎么办?
此时,我们可以把w改成a追加的方式,打开之后文件的指针会放在文件的末尾
with open('data_write', 'a') as file:
3.2 文件打开的方式
rb wb ab 这种带b的都是打开二进制文件的,比如说声音文件、图像文件、mp4
r r+ rb rb+ 这几个跟r有关的都需要文件事先存在,要不然就会报错
w w+ wb wb+
a a+ ab ab+
这8种文件不存在时会新建文件
3.3 解决非英文字符串的编码
比如手动创建一个.txt文件,里面带中文,那么读取它的时候就要加一个encoding参数,encoding=‘utf-8’ 要是不指定编码方式,那么它里面就不是utf-8
因为pycharm手工创建file的时候,编码方式都是utf-8
读取和生成的编码方式都是utf-8
encoding默认值是GBK,编码方式的不一样导致了文件的出错
# encoding的默认值 GBK
with open('data_cn_1.txt', 'r', encoding='utf-8') as file:
print("cn_1:--------") # 文件前加一个分隔符,以便区分
print(file.read())
读取和写入也一样
with open('data_cn.txt', 'w', encoding='utf-8') as file:
file.write("今天也要好好学习,ccc")
with open('data_cn.txt', 'r', encoding='utf-8') as file:
print(file.read())
# encoding的默认值 GBK
with open('data_cn_1.txt', 'r', encoding='utf-8') as file:
print("cn_1:--------")
print(file.read())
4、目录操作
os
os.path
打开IDLE,按F1键打开python文档,在索引页直接搜关键字,比如搜os
os.name
nt是windows操作系统
os.linesep
文件结尾的换行符
os.sep
文件的分隔符
os.path
当前工作的模块的一个目录
4.1 os.getcwd()
查看当前程序所在的当前目录
判断文件是否存在,返回值是True
import os
print(os.path.exists('data.txt'))
4.2 创建目录 os.mkdir()
删除目录 os.rmdir()
若目录里面有文件,则此方法不能删除
(运用相对路径)
import os
print(os.getcwd())
if not os.path.exists('dirdemo'): # 如果目录不存在就创建
os.mkdir('dirdemo')
else:
os.rmdir('dirdemo') # 如果存在就删除
(项目的根目录\项目的名字\项目的目录名)
绝对路径:在d盘创建新的目录
import os
print(os.getcwd())
dirpath = r'd:\dirdemo'
if not os.path.exists(dirpath):
os.mkdir(dirpath)
else:
os.rmdir(dirpath)
4.3 os.listdir () 列出当前目录下所有的文件和子目录
import os
filenames = os.listdir(os.getcwd())
for fname in filenames:
print(fname)
4.4 遍历目录文件 walk
比上一个更强大,可以区分目录和文件,同时还能进行递归,继续在子目录walk,将这两个子目录继续遍历到
import os
for files in os.walk(os.getcwd()):
print(files)
打印结果是一个元组,里面有3个元素,第一个元素是当前目录的一个绝对路径,第二个是一个列表,里面是子目录,第三个元素是所有文件名字的列表
上一个方法返回值是一个元组,采用序列解包将其分为3个变量,递归
import os
for dirpath, subdirs, files in os.walk(os.getcwd()):
for name in subdirs:
print("目录", os.path.join(dirpath, name)) # 绝对路径
for name in files:
print("文件",os.path.join(dirpath, name)) # 绝对路径
4.5 删除非空文件夹 shutil.rmtree()
如果想要删除的目录里有文件,则rmdir()不能将其删除
还有一个模块shutil
import shutil
shutil.rmtree()
import os
import shutil
print(os.getcwd())
dirpath = r'd:\dirdemo'
if not os.path.exists(dirpath):
os.mkdir(dirpath)
else:
shutil.rmtree(dirpath)
4.6 创建多层目录
mkdir()只能创建一层目录
os.makedirs()
import os
import shutil
print(os.getcwd())
dirpath = r'd:\dirdemo\subbir'
if not os.path.exists(dirpath):
os.makedirs(dirpath)
else:
shutil.rmtree(dirpath)
os.makedirs() 更常用
4.7 删除文件
os.remove()
import os
import shutil
print(os.getcwd())
os.remove('data_write')
但是文件不存在的话依然会报错,所以要配合文件是否存在的判断条件来使用
import os
import shutil
print(os.getcwd())
if os.path.exists('data_write'):
os.remove('data_write') # 如果文件存在就删除它