一、文件读写
常见文件的读写分类:
1.普通文本文件:txt py md html doc等
2.csv文件:.csv
3.二进制文件:图片,音频,视频,压缩包等
4.对象的序列化和反序列化:pickle和json
5.excel文件:需要借助于第三方模块xlrd和xlwt
文件读写也是面向对象的思想,常用的操作系统不允许程序直接访问磁盘,可以通过文件描述符读写文件
f = open(path,mode,encoding),执行这句代码只是在内存中打开一个文件对象,f被称为文件描述符,该对象中存储的是被打开的文件对象
1.普通文件读写
1.1写入
# 1.打开文件:open()
"""
注意:
a.可以使用w或a写入内容,二者在指定文件路径不存在的情况下,都可以生成新的文件
b.w:删除原文件,生成一个新的文件,所以如果文件存在的前提下,可以理解为覆盖掉源文件中的内容
c.a:如果文件存在的前提下将指定内容追加到源文件内容的后面
"""
# f1 = open(r'file1.txt','w',encoding='utf-8')
# f1 = open(r'file2.txt','w',encoding='gbk')
# f1 = open(r'file2.txt','w',encoding='gbk')
f1 = open(r'file2.txt','a',encoding='gbk')
# 2.写入内容:write()/writelines()
# a.write() *******
# f1.write("hello你好")
# 表示刷新,如果需要写入的内容量较大,提高写入效率
# f1.flush()
# b
# f1.writelines("13413\nfahjghj\n你好\n571857")
f1.writelines(['aaaa','bbbb','cccc']) # 将列表中的字符串元素拼接成一个字符串,直接写入
f1.flush()
# 3.关闭文件:close()
f1.close()
1.2读取
# 1.打开文件:open()
"""
open(file,mode='r',encoding)
file:要打开的文件路径,使用相对路径或绝对路径都可以
mode:文件打开的方式,
'r' open for reading (default)
'w' open for writing, truncating the file first,删除原文件,生成一个新的文件,写入内容,如果指定路径的文件不存在,则会自动创建
'x' create a new file and open it for writing,创建一个新的文件,用于写入
'a' open for writing, appending to the end of the file if it exists,将指定内容追加到已有文件已有内容的后面,可以创建一个新的文件
'b' binary mode,用于操作二进制文件
rb:以只读的方式打开一个二进制文件
wb:以写入的方式打开一个二进制文件
'+' open a disk file for updating (reading and writing)
r+:侧重于读
w+:侧重于写
encoding:编码格式
utf-8/UTF-8/UTF8/utf8
gbk/GBK
"""
"""
注意1:
a.打开文件进行读取内容时,encoding需要和原文件的编码格式保持一致,否则无法读取
b.打开文件进行读取内容时,文件路径一定要存在
c.打开模式mode默认值为r,所以读取普通文本文件,r可以省略
d.开始读取内容时,文件描述符默认在文件的开头,然后按照指定的规则进行读取
e.read()适用于文件内容较少的情况,read(size)借助于循环适用于读取文件内容较多的情况
readlines()适用于文件内容存在规律的情况下
f.文件操作完毕之后,尽量关闭文件,避免系统资源的浪费
"""
f = open(r'致橡树.txt','r',encoding='gbk')
# print(f,type(f))
# 2.读取内容:read()/readline()/readlines()
# a.f.read()默认全部读写
r1 = f.read() # ******
print(r1)
# r1 = f.read(5)
# print(r1)
# r1 = f.read(5)
# print(r1)
# b.readline():一次性读取一行
# r2 = f.readline()
# print(r2)
# c.readlines():全部读取,返回值为一个列表,一行是一个元素 ******
# r3 = f.readlines()
# print(r3)
# d.readable():并不是用来读取文件内容的,只是标记指定文件是否是可读的,返回结果为布尔值
# r4 = f.readable()
# print(r4)
# 3.关闭文件:close()
f.close()
1.3循环操作
# 1.需求:一次性只能读取5个字符
# read(n)
import os
path = r"file1.txt"
f = open(path,"r",encoding="utf-8")
# 统计文件字符数
total_size = os.path.getsize(path)
# 设定一次需要读取的字符数,一般情况下,一次读取的字符数设定为2的次方
sub_size = 1024
while total_size > 0:
r = f.read(sub_size)
print(r)
total_size -= sub_size
f.close()
# 2.需求:一次读取一行,将所有内容全部读取
# readline()
path = r"file1.txt"
f = open(path,"r",encoding="utf-8")
r = f.readline()
print(r)
while r:
r = f.readline()
print(r)
f.close()
1.4with上下文
"""
通过with上下文进行文件的读写
语法:
with open() as f:
读取/写入
说明:f其实就是一个变量,表示被打开的文件对象
注意:如果使用with上下文,不管是读取还是写入,最后不需要手动关闭文件
当with代码块执行完毕,涉及到的文件会被自动关闭
"""
# 1.读取
with open(r'致橡树.txt','r',encoding='gbk') as f:
r = f.read()
print(r)
# 2.写入
with open(r"file1.txt",'w',encoding='utf-8') as f:
f.write('abc计算机')
f.flush()
2.二进制文件读写
# 常用二进制文件有:图片,音视频,压缩包等
"""
注意:
a.如果要操作二进制文件,则使用rb或wb的方式打开二进制文件
b.如果采用rb或wb的方式打开二进制文件,则没有必要指明encoding
"""
# 1.读取
with open(r"111.png",'rb') as f1:
r = f1.read()
print(r)
# 2.写入
with open(r"img.png",'wb') as f2:
f2.write(r)
f2.flush()
3.CSV文件读写
CSV(Comma Separated Values逗号分隔值)
.csv是一种文件格式(如.txt、.doc等),也可理解.csv文件就是一种特殊格式的纯文本文件。即是一组字符序列,字符之间用英文字符的逗号或制表符(Tab)分隔
所以,CSV文件本身就是是个纯文本文件,这种文件格式经常用来作为不同程序之间的数据交互的格式
在windows系统环境上.csv文件打开方式有多种,如记事本、excel、Notepad++等,只要是文本编辑器都能正确打开
3.1读取
"""
csv文件常用的原因:
a.可以作为不同程序之间进行数据交换的中介
b.Python中内置了csv模块,直接导入就可以使用
c.csv文件可以通过excel打开,如果直接操作excel,都需要安装第三方模块
"""
import csv
# from collections import Iterator
# 1.使用普通文本文件的的读取方式可以读取csv文件,但是,没有呈现出csv数据的特点
# with open(r'c1.csv','r',encoding='utf-8') as f:
# r = f.read()
# print(r)
# 2.使用csv特有的方式读取
# a.打开
with open(r'c1.csv','r',encoding='utf-8') as f:
# b.读取
# csv.reader(iterable),文件对象f本身就是一个iterable,返回一个iterator
# 迭代器具有生成器的特点,元素是在访问的过程中生成的
r = csv.reader(f)
# print(r)
# print(isinstance(r,Iterator)) # True
# c.遍历迭代器
datalist = []
for row in r:
# print(row)
datalist.append(row)
print(datalist)
3.2写入
import csv
# 1.打开
with open(f"c2.csv",'w',encoding='utf-8') as f:
# 2.将文件对象转换为一个可迭代对象
csv_writer = csv.writer(f)
# 3.写入
# a.字符串
# csv_writer.writerow('hello') # h,e,l,l,o
# b.列表
infolist = [['name', 'age', 'hobby', 'address'], ['aaa', '10', 'dance', 'xian'], ['zhangsan', '20', 'sing', 'shanghai'], ['bbb', '14', 'piano', 'guangzhou']]
# 方式一
# for row in infolist:
# csv_writer.writerow(row)
# 方式二
csv_writer.writerows(infolist)
# 2
with open(f"c3.csv", 'w', encoding='utf-8') as f:
# c.字典
data_list = [
{'name':'张三','age':18},
{'name': '张三2', 'age': 17},
{'name': '张三3', 'age': 10},
{'name': '张三4', 'age': 13}
]
csv_writer = csv.DictWriter(f,data_list[0].keys())
# 写入标题,字典中的key会自动被作为csv文件的标题写入
csv_writer.writeheader()
# 写入正文
csv_writer.writerows(data_list)