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注意事项

在a模式下不管光标在哪个位置写入内容都会在末尾写入

3.上下文管理

在文件操作时为了方便,不用反复打开关闭文件,用with进行上下文管理较为方便

  1. #单文件管理
  2. with open("xxxx.txt", mode='rb') as file_object:
  3. data = file_object.read()
  4. print(data)
  5. #多文件管理
  6. with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:
  7. pass

4.csv格式文件

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

  1. import os
  2. import requests
  3. with open('files/mv.csv', mode='r', encoding='utf-8') as file_object:
  4. #将提取出的每行内容作为一个元素归成一个列表
  5. file_object.readline()
  6. for line in file_object:
  7. #将列表里的每个元素进行分割和去符号分别赋值给三个变量
  8. user_id, username, U = line.strip().split(',')
  9. print(username, U)
  10. # 1.根据URL下载图片
  11. res = requests.get(
  12. # 这里要根据U读取到文件地址
  13. url=U,
  14. # 这里是模拟了一个浏览器向url发送请求
  15. headers={
  16. "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"
  17. }
  18. )
  19. # 检查images目录是否存在?不存在,则创建images目录
  20. if not os.path.exists("images"):
  21. # 创建images目录
  22. os.makedirs("images")
  23. # 2.将图片的内容写入到文件
  24. with open("images/{}.png".format(username), mode='wb') as img_object:
  25. img_object.write(res.content)

5.ini格式文件

ini文件是Initialization File的缩写,平时用于存储软件的的配置文件。例如:MySQL数据库的配置文件。

读取所有节点

  1. import configparser
  2. a = configparser.ConfigParser()
  3. a.read('输入文件路径', encoding='utf-8')
  4. b = a.sections()
  5. print(b)

读取当前节点下的键值

  1. import configparser
  2. a = configparser.ConfigParser()
  3. a.read('输入文件路径', encoding='utf-8')
  4. b = a.items("mysqld_safe")
  5. print(b)

根据节点加键读取当前节点中对应的键的值

  1. import configparser
  2. config = configparser.ConfigParser()
  3. config.read('输入文件路径', encoding='utf-8')
  4. value = config.get('mysqld', 'log-bin')
  5. print(value)

检查删除添加节点

  1. import configparser
  2. config = configparser.ConfigParser()
  3. config.read('文件路径', encoding='utf-8')
  4. # config.read('my.conf', encoding='utf-8')
  5. # 检查
  6. has_sec = config.has_section('mysqld')
  7. print(has_sec)
  8. # 添加节点
  9. config.add_section("SEC_1")
  10. # 节点中设置键值
  11. config.set('SEC_1', 'k10', "123")
  12. config.set('SEC_1', 'name', "哈哈哈哈哈")
  13. config.add_section("SEC_2")
  14. config.set('SEC_2', 'k10', "123")
  15. # 内容写入新文件
  16. config.write(open('文件路径', 'w'))
  17. # 删除节点
  18. config.remove_section("SEC_2")
  19. # 删除节点中的键值
  20. config.remove_option('SEC_1', 'k10')
  21. config.write(open('文件路径', 'w'))

5.xml格式文件

可扩展的标记语言,是一种简单的数据存储语言,XML被设计用来存储和传输数据。
存储:可用来存放配置文件,例如:java的配置文件
传输:网络传输时以这种格式存在,例如:早期ajax传输的数据、soap协议等。

5.1读取文件和内容

  1. from xml.etree import ElementTree as ET
  2. # 调用ElementTree模块去打开xml文件
  3. tree = ET.parse("文件路径")
  4. #获取根标签
  5. root = tree.getroot()

5.2读取节点数据

  1. from xml.etree import ElementTree as ET
  2. #获取根标签
  3. root = ET.XML(数据变量名称)
  4. #获取到某个节点下的子标签
  5. country_object = root.find(节点名称)
  6. gdppc_object = country_object.find(子标签名称)
  7. #获取某个节点下的子标签
  8. #获取到根标签下的节点
  9. for child in root:
  10. #获取节点的所有子标签
  11. for node in child:
  12. print(node.tag, node.attrib, node.text)
  13. #直接从根目录获取到标签
  14. for child in root.iter(获取的标签名称)
  15. #将节点下的所有标签输出
  16. root.findall("数据变量名称")
  17. #一级一级获取标签
  18. root.find("节点名称").find("标签名称")

5.3修改和读取节点

修改节点内容和属性

  1. from xml.etree import ElementTree as ET
  2. #获取根标签
  3. root = ET.XML(content)
  4. #获取根标签下的节点名称以及其下的标签
  5. rank = root.find('节点名称').find('标签名称')
  6. #修改标签的值
  7. rank.text = "修改标签内容的值"
  8. #为标签增加属性
  9. rank.set("属性名称","属性的值")

删除节点

  1. root.remove(root.find("节点名称"))

保存文件

  1. tree = ET.ElementTree(根目录名称)
  2. tree.write("需要保存为的文件名.xml", encoding='所用的编码')

5.4构建文档

1

  1. from xml.etree import ElementTree as ET
  2. #创建根目录
  3. root = ET.element("根名称")
  4. #创建节点
  5. son1 = ET.Element('节点名称', {'节点属性名称': '节点属性的值'})
  6. son2 = ET.Element('节点名称', {'节点属性名称': '节点属性的值'})
  7. #在son1节点中创建两个标签
  8. grandson1 = ET.Element('标签名称', {'标签属性名称': '标签属性的值'})
  9. grandson2 = ET.Element('标签名称', {'标签属性名称': '标签属性的值'})
  10. son1.append(grandson1)
  11. son1.append(grandson2)
  12. #将节点添加进根目录下
  13. root.append(son1)
  14. root.append(son2)
  15. #保存文件
  16. tree = ET.ElementTree(root)
  17. #选择是否使用短标签,是最后填True,不是则False
  18. tree.write('文件名称.xml', encoding='所用编码', short_empty_elements=False)

2

  1. from xml.etree import ElementTree as ET
  2. #创建根目录
  3. root = ET.Element("根名称")
  4. #创建节点
  5. son1 = root.makeelement('节点名称', {'节点属性名称': '节点属性的值'})
  6. son2 = root.makeelement('节点名称', {'节点属性名称': '节点属性的值'})
  7. #在son1节点中创建两个标签
  8. grandson1 = son1.makeelement('标签名称', {'标签属性名称': '标签属性的值'})
  9. grandson2 = son1.makeelement('标签名称', {'标签属性名称': '标签属性的值'})
  10. son1.append(grandson2)
  11. #将节点添加进根目录下
  12. root.append(son1)
  13. root.append(son2)
  14. #保存文件
  15. tree = ET.ElementTree(root)
  16. tree.write('文件名称.xml', encoding='所用编码')

3

  1. from xml.etree import ElementTree as ET
  2. # 创建根目录
  3. root = ET.Element("根目录名称")
  4. # 创建节点
  5. son1 = ET.SubElement(root, "节点名称", attrib={'节点属性名称': '节点属性的值'})
  6. son2 = ET.SubElement(root, "节点名称", attrib={'节点属性名称': '节点属性的值'})
  7. # 在节点中创建标签
  8. grandson1 = ET.SubElement(son1, "标签名称", attrib={'标签属性名称': '标签属性的值'})
  9. grandson1.text = '标签内容'
  10. #生成文档对象
  11. et = ET.ElementTree(root)
  12. et.write("文件名称.xml", encoding="所用编码")

4.另一种格式的xml格式文件

  1. from xml.etree import ElementTree as ET
  2. # 创建根目录
  3. root = ET.Element("根目录名称")
  4. root.text = "<![CDATA[你好呀]]"
  5. # 生成文档对象
  6. et = ET.ElementTree(root)
  7. et.write("文件名称.xml", encoding="所用编码")
  8. # <user><![CDATA[你好呀]]</user>

6.压缩文件

调用python内置的shutill模块可以实现对压缩文件的操作

  1. import shutil
  2. #压缩文件
  3. # base_name,压缩后的压缩包文件
  4. # format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar".
  5. # root_dir,要压缩的文件夹路径
  6. shutil.make_archive(base_name=r'datafile',format='zip',root_dir=r'files')
  7. #解压文件
  8. # filename,要解压的压缩包文件
  9. # extract_dir,解压的路径
  10. # format,压缩文件格式
  11. shutil.unpack_archive(filename=r'datafile.zip', extract_dir=r'xxxxxx/xo', format='zip')

7.路径

windows系统需要转义时,可以多加\和在路径前加r进行转义
路径操作函数

  1. import shutil
  2. import os
  3. # 1. 获取当前脚本绝对路径
  4. """
  5. a = os.path.abspath(__file__)
  6. print(a)
  7. """
  8. # 2. 获取当前文件的上级目录
  9. """
  10. a = os.path.dirname( os.path.abspath(__file__) )
  11. print(a)
  12. """
  13. # 3. 路径拼接
  14. """
  15. p1 = os.path.join(需要拼接的路径, '路径1')
  16. print(p1)
  17. p2 = os.path.join(需要拼接的路径, 'xx', 'oo', 'a1.png')
  18. print(p2)
  19. """
  20. # 4. 判断路径是否存在
  21. """
  22. exists = os.path.exists("需要判断的路径")
  23. print(exists)
  24. """
  25. # 5. 创建文件夹
  26. """
  27. os.makedirs(路径)
  28. """
  29. """
  30. path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
  31. if not os.path.exists(path):
  32. os.makedirs(path)
  33. """
  34. # 6. 是否是文件夹
  35. """
  36. file_path = os.path.join(base_path, 'xx', 'oo', 'uuuu.png')
  37. is_dir = os.path.isdir(file_path)
  38. print(is_dir) # False
  39. folder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
  40. is_dir = os.path.isdir(folder_path)
  41. print(is_dir) # True
  42. """
  43. # 7. 删除文件或文件夹
  44. """
  45. os.remove("文件路径")
  46. """
  47. """
  48. path = os.path.join(base_path, 'xx')
  49. shutil.rmtree(path)
  50. """
  51. # 8. 拷贝文件夹
  52. """
  53. shutil.copytree("/Users/wupeiqi/Desktop/图/csdn/","/Users/wupeiqi/PycharmProjects/CodeRepository/files")
  54. """
  55. # 9.拷贝文件
  56. """
  57. shutil.copy("/Users/wupeiqi/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/")
  58. shutil.copy("/Users/wupeiqi/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/x.png")
  59. """
  60. # 10.文件或文件夹重命名
  61. """
  62. shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/xxxx.png")
  63. shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/files","/Users/wupeiqi/PycharmProjects/CodeRepository/images")
  64. """