文件的打开方式

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对象["单元格位置":“单元格位置”]