文件的打开方式
1.文件内容
文件是由于字节和字符串组成的文本。
在图片中是一个个的像素点组成的。
字节可以代表2进制的信息和图片。
2.关于文件的路径
文件路径分为2种:
1.相对路径:程序在运行时,相同文件夹下不同的文件关系。
2.绝对路径:完整的路径(不推荐使用)
3.转换字节
encode(utf-8) 将字符串转换为字节
decode(utf-8) 将字节转换字符串
4.文件的打开方式
模式的分类:
b:字节类型,读取的是二进制数据,字节形式存在
t:文本类型,读取的是二进制数据,内部会根据encoding转换成为字符串类型
5.关于图片和视频
1.图片没办法转换,只能读取二进制字节
2.打开文件 使用rd(只是读取了2进制内容)
文件的模式
1.写入模式
w模式:
w模式:没有文件,创建文件。存在文件清空文件,在进行写入。
wb:写入文件的字节类型
wt:写入文件的文本类型,内部会根据encoding()进行转换 简写w
x模式:
x模式:写入模式,没有文件创建文件,如果文件存在就会报错。
xb:写入文件的字节类型
xt:写入文件的文本类型,内部会根据encoding()进行转换 简写x
a模式:
a模式:写入模式,打开文件,从尾部增加写入,不存在文件,创建在写入。(光标在内容尾部)
ab:写入文件的字节类型
at:写入文件的文本类型,内部会根据encoding()进行转换 简写 a
2.读取模式
r模式:
r模式:读取模式,读取文件的内容。
rb:读取文件的字节类型(主要用于读取图片,视频。因为不需要进行转换)
rt:读取文件的文本类型,内部会根据encoding()进行转换,得到的读取结果就是字符串 键写r
3.带+模式(能读能写)
在+号模式下面需要注意:
1.如果先读在写,不会覆盖之前的内容。因为:已经将内容读取,光标的位置在尾部
2.如果先写在读,就会覆盖文件的原有内容。因为:光标起始位置在起始,就会覆盖原有的内容,读取覆盖内容后面的原始内容。
r+ = rt+ = rb+ 追加
即可读又可以写,写在文件的尾部(文件不会创建)
w+ = wt+= wb+ 重置内容 写入新内容
光标位置都是起始位置(读取时,清空文件。)没有文件创建文件
a+ = at+ = ab+ 追加
光标位置在尾部(读取时,需要现设置光标的位置)
对文件的操作
1.读取:
使用:
接收的对象 = open('文件路径','读取格式',encoding='utf-8')
对象.read()
对象.close()
endcoding 参数不适用与rb模式 二进制模式不接受编码参数,只能在读取时使用decode转换
案例:
1. r 模式
f = open('1.txt','r')
f.read() 读取的是字符串
f.close() 关闭文件
2.rb模式 # 可以读取图片的二进制
f = open('1.txt','rb)
f.read().decode('utf-8') 读取内容字节类型需要转为utf-8
f.close() 关闭文件
3.r+模式
f = open('1.txt','r')
f.read() 读取的是字符串
f.close() 关闭文件
4.rt模式内部转换utf-8
f = open('1.txt','rt')
f.read() 读取的是字符串
f.close() 关闭文件
2.写入文件
使用:
接收的对象 = open('文件路径','打开格式')
对象.write('写入内容'.encdoe('utf-8')) 写入
对象.close() 关闭
在使用w模式时如果文件不存在都可以创建文件
wb模式写入字节,其他的w模式默认写入字符串
案例:
1. r 模式
f = open('1.txt','w')
f.write('写入内容') 写入
f.close() 关闭文件
2.rb模式 # 可以读取图片的二进制
f = open('1.txt','tb')
f.write('写入内容,字节不是字节需要转为字节')写入
f.close() 关闭文件
3.r+模式
f = open('1.txt','w+')
f.write('写入内容') 写入
f.close() 关闭文件
4.rt模式内部转换utf-8
f = open('1.txt','rt')
f.write('写入内容') 写入
f.close() 关闭文件
3.写入或者读取图片和视频
使用b模式,读取rd,写入wd
f_r = open('图片.png', 'rb')
f_w = open('新图片.png','wb')
f_w.write(f_r.read())
f_w.close() 关闭文件
f_r.close() 关闭文件
为什么使用b模式?
因为图片和视频都是二进制进行存储的就需要是用b模式进行打开或者写入。
4.读写的常见功能
1.读功能
1.read()读取文件全部内容或者几个字符(用)
变量 = 对象.read() 读取全部内容
变量 = 对象.read(加上整数值),模式:rb,读取多少字节。模式:rt = r,读取多少字符串
2.readline()读取文件内部一行数据
变量 = 对象.readline() 只读一行数据,取决于模式不同:rb,读取字 节。rt,读取字符串
3.readlines() 读取全部内容,返回一个列表
变量 = 对象.readlines() 读取全部内容,返回一个列表
4.使用for循环读取大型文件 (用)
当读取内容完毕后,自动停止。
不需要进行文件对象的操作,直接进行for循环对象就可以读取内容。
5.写功能
1.write(内容)写入内容。 用于:w模式和a模式
对象.write(内容)
2.flush() 刷到硬盘
对象.flush(),在写入文件时,会将内容写入电脑缓冲区,会出现数据不全 的情况。使用flush()立即存入电脑硬盘中。
3.seek()移动光标位置
无论模式是什么:移动的永远是字节的位置
对象.seek(移动的整数A),这个A指的是移动光标的字节位置。
在a模式下,write写入文件时,seek不会修改光标的位置,a模式永远是先将 光标移动到尾部。
4.tell()获取光标的位置
变量 = 对象.tell() 获取光标位置是按照字节计算
6.文件打开方式上下文管理
with open("文件地址",mode="打开模式",按照b还是t使用字符串(encode(utf-8))) as 新的署名(文件对象):
代码....
当代码执行完毕后,自动关闭文件,不需要手动关闭。
方便快捷。
with 同时支持 多个 上下文管理执行。
with open(路径,打开方式)as 文件对象,open(路 径,打开方式)as 文件对象;
案例:
with open('图片.png', 'rb') as f_r:
with open('新图片.png',"wb") as f_w:
f_w.write(f_r.read())
其他的文件操作
1.csv文件操作
属于在文件中以固定符号进行分开的文件格式。
一般利用字符串的.split("符号")进行分割。
利用.strip()进行清除文件中的换行符。
2.ini文件格式
例如uwgis配置文件,mysql配置文件格式等等
ini格式文件 类似
[节点]
内容....
A键 = b值....
[节点]
内容....
import configparser
1.创建对象
ini = configparser.ConfigParser()
2.导入ini文件路径
ini.read('m.ini',encoding='utf-8') # 读取文件
3.使用方法
ini.sections() # 读取全部的节点
ini.items('mysql') # 获取当前节点下的k v 格式[(k,v)...]
ini.get('mysql','a') # 获取节点mysql下的a对应的val
ini.has_section('mysql') # 判断节点是否存在 返回结果True/False
添加节点
ini.add_section('nginx') # 将节点添加到文件中 如果只执行add_section的话添加内存没有写入文件
ini.write(open('m.ini',mode="w",encoding="utf-8"))
添加节点下的k,v
ini.set('nginx','测试key','测试节点val')
ini.write(open('m.ini',mode="w",encoding="utf-8"))
删除节点
ini.remove_section("mysql")
ini.write(open('m.ini',mode="w",encoding="utf-8"))
删除节点k,v
ini.remove_option('uwgis','b')
ini.write(open('m.ini',mode="w",encoding="utf-8"))
3.xml格式文件操作
与html相似
存储,可用来存放配置文件,例如:java的配置文件。
传输,网络传输时以这种格式存在,例如:早期ajax传输的数据、soap协议等。
存放配置文件 java
传输,网络传输时以这种格式存在
微信公众号时xml格式
结构
<data>
<节点1 属性>
<名称 属性>值 <名称>
</节点>
<节点1>
内容
</节点>
</data>
导包:
from xml.etree import ElementTree
查看:
from xml.etree import ElementTree as et(定义简约名)
1.打开xml文件,创建一个xml文件对象
对象 = et.parse(“xml文件地址”)
2.获取xml下面的跟标签
跟标签变量 = 对象.getroot()
3.获取跟标签下面的全部子标签内容
子标签变量 = 跟标签变量.findall(“子标签名字”)
4.获取些节点的内容
子标签变量 = 跟标签变量.find(“子标签名字”)
5.获取子标签下面的全部内容
变量 = 子标签变量.find(“子标签下面的标签”)
获取详细的标签内容的全部值
变量.tag 子标签下面的标签名称
变量.attrid 子标签下面的标签属性
变量.text 子标签下面的标签值
修改
1.打开xml文件,创建一个xml文件对象
对象 = et.parse(“xml文件地址”)
2.获取xml下面的跟标签
跟标签变量 = 对象.getroot()
3.修改标签内的值
修改了内存的值,没有存储在文件中
变量 = 对象.find("子标签").find("子标签下面的标签名")
变量.text = "修改的值"
存放在文件中
对象 = et. ElementTree(变量)
对象.write(“文件路径”,encoding=“”utf-8”)
4.添加属性
只是修改了内存的值,没有存在文件中
变量 = 对象.find("子标签").find("子标签下面的标签名")
变量.sat(“属性名字”,“属性值”)
存放在文件中
对象 = et. ElementTree(变量)
对象.write(“文件路径”,encoding=“”utf-8”)
5.删除节点中的子标签
变量 = 对象.find(“子标签”)
跟标签对象.remove(变量)
创建对象
1.创建跟标签
跟标签对象 = et.Element(“跟节点名称”)
2.创建子节点
子节点对象 = et.Element(“子标签名字”,标签属性({“键”:“值”}))
3.创建子节点下面的内容节点
内容节点 = et.Element(“内容标签名字”,标签属性({“键”:“值”}))
4.添加将内容节点添加到字节下面
子节点对象.append(内容节点)
5.将子节点添加到跟标签下面
跟标签对象 .append(子节点对象)
6.写入文件
变量 = et.ElementTree(跟标签对象)
变量 .write(“文件地址.xml”,encoding=“utf-8”,short_empty_elements=False)
short_empty_elements=False
参数:False 长标签
参数:True 存短标签
通过网络传输获取
可以使用变量进行接受xml标签
变量 = “xml内容”
变量 = et.XML("放入请求的xml变量")
读取节点数据 循环获取 字标签
for i in 变量:
j = i.tag:(获取跟标签下的字标签)
for f in j:(获取字标签内容标签的内容)
j.tag 名字
j.attrib 属性
j.text 值
4.excel文件
1.导入文件
from openpyxl import load_workbook
2.创建excel的 路径对象
对象 = load_workbook("excel路径")
3.sheet的相关操作
1.获取sheet的全部名称
对象 = 对象.sheetnames
2.选择sheet名称获取
sheet对象(名称) = 对象["sheet的名称"]
3.获取sheet对象下面的某行结果内容
变量 = heet对象.cell(“行”,“列”)
4.根据索引位置获取sheet的对象获取
sheet对象(索引) = wb.worksheets[sheet索引位置]
5.循环获取全部的sheet
for i in 对象.sheetnames 获取全部的sheet
sheet对象 = wb[i] 为每一个sheet创建一个对象
变量 = sheet对象.cell(“行”,“类”) 获取sheet和行列结果
变量.value 获取结果
4.读取sheet下面的单元格操作
1.创建excel的 路径对象
对象 = load_workbook("excel路径")
2.根据索引位置获取sheet的对象获取
sheet对象(索引) = wb.worksheets[sheet索引位置]
3.获取sheet行和列单元格信息 ,从1开始
变量 = sheet对象.cell(行,列)
变量.value 获取文本信息
变量.style 获取样式
变量.font 字体
变量.alignment 排列情况
4.根据excel表的位置获取单元格对象内容
变量 = sheet对象["单元格位置:A1...M2"]
5.获取行内全部的单元格对象
变量 = sheet对象["指定的行名"]
6.获取全部行的内容某行者整行
变量 = sheet对象.rows
变量[索引].value 索引 制定一行者某些数据内容
7.获取全部列某列或者整列
变量 = 对象.columns
变量[索引].value 引 制定一行者某些数据内容
5.读取合并单元格
sheet对象.cell[列,行]
当读取合并的内容是正常读取,但是合并的格结果是个none
一行能读出来结果,一行读出来是none
6.写入excel表
原文件:
1.创建excel的 路径对象
对象 = load_workbook("excel路径")
2.根据索引位置获取sheet的对象获取
sheet对象(索引) = 对象.worksheets[sheet索引位置]
3.找到需要写入的表行
变量 = sheet对象.cell(行,列)
变量.value = “更新新值”
4.储存
对象.save(“文件原地址/新”)
新建文件
1.创建一张excel
对象 = workbook.workbook
2.选中sheet
sheet对象(索引) = 对象.worksheets[sheet索引位置]
3.找到需要写入的表行
变量 = sheet对象.cell(行,列)
变量.value = “更新新值”
4.储存
对象.save(“文件原地址/新”)
7.修改sheet名字和添加
1.修改sheet名字
1.获取sheet对象
sheet对象(索引) = 对象.worksheets[sheet索引位置]
2.修改sheet名字
sheet对象(索引).title = “新名字”
3.储存
对象.save(“文件原地址/新”)
2.创建新的sheet
1.创建新sheet
sheet对象 = 对象.create_sheet(新sheet名,存放sheet 位置索引)
2.修改sheet的颜色
sheet对象.sheet_properties.eabColor = "2进制颜色对 照表"
3.默认展开制定的sheet
对象.active = sheet[索引]
4.拷贝sheet
考被对象 = 对象.copy_worksheet(对象['sheet名字'])
5.删除sheet
def 对象[删除的sheet]
6.对单元格部分内容进行修改
对象 = sheet对象["单元格位置":“单元格位置”]