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 os
import requests
with 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 configparser
a = configparser.ConfigParser()
a.read('输入文件路径', encoding='utf-8')
b = a.sections()
print(b)
读取当前节点下的键值
import configparser
a = configparser.ConfigParser()
a.read('输入文件路径', encoding='utf-8')
b = a.items("mysqld_safe")
print(b)
根据节点加键读取当前节点中对应的键的值
import configparser
config = configparser.ConfigParser()
config.read('输入文件路径', encoding='utf-8')
value = config.get('mysqld', 'log-bin')
print(value)
检查删除添加节点
import configparser
config = 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,不是则False
tree.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 shutil
import 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) # False
folder_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")
"""