1.路径
相对路径:就是指要查找的文件的路径相对于当前文件的路径用/连接,如:a.py代码想调用同目录下的b.txt文件,相对路径就是b.txt;如果b.txt存放在当前目录下的一个文件夹【1】里,当前相对路径为1/b.txt
绝对路径:查找的文件在硬盘中的存储目录位置用\连接
2.文件的操作模式
2.1文件操作模式注意事项
注意光标的位置,如果先读光标就会移动到末尾,这时写入就会在文件结尾添加;如果先写光标就会从移动到输入内容的尾部,原来的内容会被覆盖,在读时就会从光标开始往后读。
2.2文件操作模式种类
添加功能模式:
b 模式:将读取的文件以字节类型输出出来
+模式:读+写模式
文件操作模式(单模式:读取内容时以字符串格式读取)
r 模式:只读模式,有r、rt、rb三种情况,文件存在时读取文件;文件不存在时报错
w模式:只写模式,有w、wt、wb三种情况,文件存在时将文件内容清空然后写入内容;文件不存在时先创建文件然后写入内容
x模式:只写模式,有x、xt、xb三种情况,文件存在时会报错;文件不存在时会创建文件再写入
a模式:只写模式,有a、at、ab三种情况,文件存在时会在文件尾部追加内容;文件不存在时会创建文件再写入
文件操作模式(单模式:读取内容时以字节模式读取)
r+模式:读写模式,有r+、rt+、rb+三种情况,光标起始位置是开头
w+模式:读写模式,有w+、wt+、wb+三种情况,光标起始位置是开头(清空文件)
x+模式:读写模式,有x+、xt+、xb+三种情况,光标起始位置是开头(新文件)
a+模式:读写模式,有a+、at+、ab+三种情况,光标起始位置默认是文件尾部
2.3注意事项
3.上下文管理
在文件操作时为了方便,不用反复打开关闭文件,用with进行上下文管理较为方便
#单文件管理with open("xxxx.txt", mode='rb') as file_object:data = file_object.read()print(data)#多文件管理with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:pass
4.csv格式文件
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
import osimport requestswith open('files/mv.csv', mode='r', encoding='utf-8') as file_object:#将提取出的每行内容作为一个元素归成一个列表file_object.readline()for line in file_object:#将列表里的每个元素进行分割和去符号分别赋值给三个变量user_id, username, U = line.strip().split(',')print(username, U)# 1.根据URL下载图片res = requests.get(# 这里要根据U读取到文件地址url=U,# 这里是模拟了一个浏览器向url发送请求headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"})# 检查images目录是否存在?不存在,则创建images目录if not os.path.exists("images"):# 创建images目录os.makedirs("images")# 2.将图片的内容写入到文件with open("images/{}.png".format(username), mode='wb') as img_object:img_object.write(res.content)
5.ini格式文件
ini文件是Initialization File的缩写,平时用于存储软件的的配置文件。例如:MySQL数据库的配置文件。
读取所有节点
import configparsera = configparser.ConfigParser()a.read('输入文件路径', encoding='utf-8')b = a.sections()print(b)
读取当前节点下的键值
import configparsera = configparser.ConfigParser()a.read('输入文件路径', encoding='utf-8')b = a.items("mysqld_safe")print(b)
根据节点加键读取当前节点中对应的键的值
import configparserconfig = configparser.ConfigParser()config.read('输入文件路径', encoding='utf-8')value = config.get('mysqld', 'log-bin')print(value)
检查删除添加节点
import configparserconfig = configparser.ConfigParser()config.read('文件路径', encoding='utf-8')# config.read('my.conf', encoding='utf-8')# 检查has_sec = config.has_section('mysqld')print(has_sec)# 添加节点config.add_section("SEC_1")# 节点中设置键值config.set('SEC_1', 'k10', "123")config.set('SEC_1', 'name', "哈哈哈哈哈")config.add_section("SEC_2")config.set('SEC_2', 'k10', "123")# 内容写入新文件config.write(open('文件路径', 'w'))# 删除节点config.remove_section("SEC_2")# 删除节点中的键值config.remove_option('SEC_1', 'k10')config.write(open('文件路径', 'w'))
5.xml格式文件
可扩展的标记语言,是一种简单的数据存储语言,XML被设计用来存储和传输数据。
存储:可用来存放配置文件,例如:java的配置文件
传输:网络传输时以这种格式存在,例如:早期ajax传输的数据、soap协议等。
5.1读取文件和内容
from xml.etree import ElementTree as ET# 调用ElementTree模块去打开xml文件tree = ET.parse("文件路径")#获取根标签root = tree.getroot()
5.2读取节点数据
from xml.etree import ElementTree as ET#获取根标签root = ET.XML(数据变量名称)#获取到某个节点下的子标签country_object = root.find(节点名称)gdppc_object = country_object.find(子标签名称)#获取某个节点下的子标签#获取到根标签下的节点for child in root:#获取节点的所有子标签for node in child:print(node.tag, node.attrib, node.text)#直接从根目录获取到标签for child in root.iter(获取的标签名称)#将节点下的所有标签输出root.findall("数据变量名称")#一级一级获取标签root.find("节点名称").find("标签名称")
5.3修改和读取节点
修改节点内容和属性
from xml.etree import ElementTree as ET#获取根标签root = ET.XML(content)#获取根标签下的节点名称以及其下的标签rank = root.find('节点名称').find('标签名称')#修改标签的值rank.text = "修改标签内容的值"#为标签增加属性rank.set("属性名称","属性的值")
删除节点
root.remove(root.find("节点名称"))
保存文件
tree = ET.ElementTree(根目录名称)tree.write("需要保存为的文件名.xml", encoding='所用的编码')
5.4构建文档
1
from xml.etree import ElementTree as ET#创建根目录root = ET.element("根名称")#创建节点son1 = ET.Element('节点名称', {'节点属性名称': '节点属性的值'})son2 = ET.Element('节点名称', {'节点属性名称': '节点属性的值'})#在son1节点中创建两个标签grandson1 = ET.Element('标签名称', {'标签属性名称': '标签属性的值'})grandson2 = ET.Element('标签名称', {'标签属性名称': '标签属性的值'})son1.append(grandson1)son1.append(grandson2)#将节点添加进根目录下root.append(son1)root.append(son2)#保存文件tree = ET.ElementTree(root)#选择是否使用短标签,是最后填True,不是则Falsetree.write('文件名称.xml', encoding='所用编码', short_empty_elements=False)
2
from xml.etree import ElementTree as ET#创建根目录root = ET.Element("根名称")#创建节点son1 = root.makeelement('节点名称', {'节点属性名称': '节点属性的值'})son2 = root.makeelement('节点名称', {'节点属性名称': '节点属性的值'})#在son1节点中创建两个标签grandson1 = son1.makeelement('标签名称', {'标签属性名称': '标签属性的值'})grandson2 = son1.makeelement('标签名称', {'标签属性名称': '标签属性的值'})son1.append(grandson2)#将节点添加进根目录下root.append(son1)root.append(son2)#保存文件tree = ET.ElementTree(root)tree.write('文件名称.xml', encoding='所用编码')
3
from xml.etree import ElementTree as ET# 创建根目录root = ET.Element("根目录名称")# 创建节点son1 = ET.SubElement(root, "节点名称", attrib={'节点属性名称': '节点属性的值'})son2 = ET.SubElement(root, "节点名称", attrib={'节点属性名称': '节点属性的值'})# 在节点中创建标签grandson1 = ET.SubElement(son1, "标签名称", attrib={'标签属性名称': '标签属性的值'})grandson1.text = '标签内容'#生成文档对象et = ET.ElementTree(root)et.write("文件名称.xml", encoding="所用编码")
4.另一种格式的xml格式文件
from xml.etree import ElementTree as ET# 创建根目录root = ET.Element("根目录名称")root.text = "<![CDATA[你好呀]]"# 生成文档对象et = ET.ElementTree(root)et.write("文件名称.xml", encoding="所用编码")# <user><![CDATA[你好呀]]</user>
6.压缩文件
调用python内置的shutill模块可以实现对压缩文件的操作
import shutil#压缩文件# base_name,压缩后的压缩包文件# format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar".# root_dir,要压缩的文件夹路径shutil.make_archive(base_name=r'datafile',format='zip',root_dir=r'files')#解压文件# filename,要解压的压缩包文件# extract_dir,解压的路径# format,压缩文件格式shutil.unpack_archive(filename=r'datafile.zip', extract_dir=r'xxxxxx/xo', format='zip')
7.路径
windows系统需要转义时,可以多加\和在路径前加r进行转义
路径操作函数
import shutilimport os# 1. 获取当前脚本绝对路径"""a = os.path.abspath(__file__)print(a)"""# 2. 获取当前文件的上级目录"""a = os.path.dirname( os.path.abspath(__file__) )print(a)"""# 3. 路径拼接"""p1 = os.path.join(需要拼接的路径, '路径1')print(p1)p2 = os.path.join(需要拼接的路径, 'xx', 'oo', 'a1.png')print(p2)"""# 4. 判断路径是否存在"""exists = os.path.exists("需要判断的路径")print(exists)"""# 5. 创建文件夹"""os.makedirs(路径)""""""path = os.path.join(base_path, 'xx', 'oo', 'uuuu')if not os.path.exists(path):os.makedirs(path)"""# 6. 是否是文件夹"""file_path = os.path.join(base_path, 'xx', 'oo', 'uuuu.png')is_dir = os.path.isdir(file_path)print(is_dir) # Falsefolder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu')is_dir = os.path.isdir(folder_path)print(is_dir) # True"""# 7. 删除文件或文件夹"""os.remove("文件路径")""""""path = os.path.join(base_path, 'xx')shutil.rmtree(path)"""# 8. 拷贝文件夹"""shutil.copytree("/Users/wupeiqi/Desktop/图/csdn/","/Users/wupeiqi/PycharmProjects/CodeRepository/files")"""# 9.拷贝文件"""shutil.copy("/Users/wupeiqi/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/")shutil.copy("/Users/wupeiqi/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/x.png")"""# 10.文件或文件夹重命名"""shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/xxxx.png")shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/files","/Users/wupeiqi/PycharmProjects/CodeRepository/images")"""
