1.读取文件

1.1读文本文件

  1. #3个步骤
  2. moderbrt 以字节的形式读取就是2进制,以文本的方式读就是字符串,是从当前指针开始读的
  3. 1.打开文件
  4. file = open'文件',mode='rb')# 将文件以rb的读取方式打开并赋值给file
  5. #将文件以rt的读取方式读取,编码为utf-8,打开并赋值给file , t模式默认是str也就是unicode编码
  6. file = open('文件', mode = 'rt', encoding='utf-8')
  7. 2.读取文件内容
  8. data = file.read() #读取file文件的内容赋值给data
  9. 3.关闭文件
  10. file.close()
  11. # 不指定encoding参数,操作系统会使用自己默认的编码
  12. # linux系统默认用utf8编码
  13. # windows系统默认用gbk编码

1.2读非文本文件,如图片视频

  1. file = '文件路径'mode='rb'
  2. data = file.read()
  3. file.close()

1.3 读操作常用功能

1.3.1 读所有 .read

1.3.2 读n个字符.read(个数)
  1. file = open ('F:\xuexi\1.txt',mode = 'rt',encoding='utf-8')
  2. data = file.read(2) # 读两个字符
  3. data1= file.read(1) # 读的是第3个字符,因为此时的光标在第2个字符之后
  4. file.close
  5. print(data)
  6. # 在读字节的时候需要把读取模式换成rb就好,注意,3个字节是一个字符

1.3.3 读一行.readline()
  1. file = open(r'F:\xuexi\1.txt',mode = 'r' , encoding='utf-8')
  2. data = file.readline()
  3. data1 = file.readline()
  4. file.close()
  5. # .readline()后面无发跟行数,如果写行数,是读几个字符和read一样
  6. #注意读几行的时候也要考虑光标的位置及程序运行的顺序
  7. 循环读文件
  8. file = open(r'F:\xuexi\1.txt',mode = 'r' , encoding='utf-8')
  9. for line in file:
  10. print(line.strip())
  11. file.close()
  12. #此时输出会有两空行,是文件中的换行和print的换行,如果要去除可以结合字符串的strip()

1.3.4 读所有行,每行作为一个元素的列表 .readlines()
  1. file = open('F:\xuexi\1.text',mode='r'.encoding='utf-8')
  2. data = file.readlines()
  3. file.close()
  4. # 读出所有的文件

1.3.5 写入硬盘.flush()
  1. file = open('F:\xuexi\1.txt',mode='a',encoding='utf-8')
  2. file.write('你好') # 不是写到了硬盘是写到了缓冲区,系统会一段时间内刷到硬盘
  3. file.flush()#现在就刷到硬盘
  4. file.close()

1.3.6 移动光标位置(字节位单位)

a模式下,用write写的时候只能写入尾部,不会写道光标志的位置

a+ 模式下用read是可以结合seek()的

  1. file=open('F:\xuexi\1.txt',mode='rt',encoding='utf-8')
  2. f.seek(3)
  3. np = file.raed()
  4. f.close()
  5. # 0 参照物是文件开头位置 在t模式和b模式下都可以使用
  6. # 1 参照物是当前指针所在位置 只能在b模式下
  7. # 2 参照物是文件末尾位置 只能在b模式下
  8. f.seek(9,0)
  9. # 从文件开头开始移动9个字节
  10. f.seek(3,1)

1.3.7 获取当前的光标位置(按字节算)
  1. file=open(r'F:\xuexi\1.txt',mode='rt',encoding='utf-8')
  2. n = file.tell()
  3. file.read(2)
  4. n1 = file.tell()
  5. file.close()
  6. print(n,n1)
  7. # 输出 0 ,6
  8. #1个字符3个字节
  9. #注意模式,rb的话就是按字节去读

1.4 上下文管理with

对文件进行操作时,每次都要打开关闭文件,繁琐

可以使用with,可以实现自动关闭文件

  1. with open(r'F:\xuexi\1.txt',mode='rt') as file:
  2. data = file.read()
  3. print(data)
  4. #file就是代指了打开文件这个操作
  1. #python2.7后支持同时对多个文件进行上下文管理
  2. with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:
  3. pass

1.5 注意事项

绝对路径
  1. file = open('c:\学习\1.text', mode = 'rt',encoding='utf-8')
  2. data = file.read()
  3. file.close()
  4. """
  5. windows下写绝对路径容易出现转义的问题:如:c:\xx\ntr\1.text 会把\n转义为换行会报错,需要加两个\\,可以解决c:\xx\\ntr\1.text
  6. """

相对路径

程序的运行目录

读文件时文件不存在会报错

判断文件路径是否存在
  1. #需要引入os模块
  2. import os
  3. file_path = 'c:\xuexi\1.text'
  4. exits = os.path.exists(file_path)#判断file_path路径是否存在返回bool
  5. if exits
  6. file = ('c:\xuexi\1.tetx',mode='rt',encoding='utf-8')
  7. data = file.read()
  8. file.close()

2.写文件

写文件的时候为了避免内存空间的占用,一般就打开一次文件等全部的写操作完成后再进行关闭

w在写文件的时候,文件不存在会先创建文件再写入,如果存在则清空文件再写入

2.1 写文本文件

  1. 1.打开文件
  2. file = open'c:\xuexi\1.text',mode='wb' #以2进制的形式写
  3. file = open'c:\xuexi\1.text',mode='wt',encoding='utf-8' # 以字符串的形式写,编码为utf8写到文件里
  4. 2.写入内容
  5. file.write('nihao'.encode(utf-8)) #在以2进制的形式写的时候可以结合字符串的独有方法encode,这样写入的也是字符串
  6. 3.关闭文件
  7. file.close()

2.2 写图片文件等

  1. file1 = open('c:\tupian\1.png',mode='rb')
  2. file2 = file1.read()
  3. file1.close()
  4. file3 = open('c:\tupian\2.png',mode='wb')
  5. file3.write(file2)
  6. file3.close()
  7. #读取1.png,将其写入到2.png文件中
  8. w在写文件的时候会先清空内容然后再写入

3 文件的打开模式

  • 只读:r rt rb
    文件存在就读,不存在报错
  • 只写: w wb wt
    文件存在情况该文件写,不存在创建该文件写
  • 只写: x xb xt
    存在报错,不存在创建再写
  • 只写 :a ab at 在尾部追加
    存在在尾部追加,不存在创建再写
  • 读写 r+ rb+ rt+ ,默认的光标是文件的开始位置
    ```python file = open (‘c:\xuexi\1.text’ ,mode = ‘rt+’,encoding=’utf-8’)

data = file.read() # 读到了最后

new_data = file.write(‘nihao’)#然后开始写,想当于追加了

r+ 写文件的时候从文件开头写会覆盖内容

file.close()

  1. - 读写: w+ wb+ wt+ 默认的光标位置是文件的开始位置
  2. ```python
  3. file = open('F:\xuexi\1.txt',mode='wt+',encoding='utf-8')
  4. data = file.read()
  5. file.seek(0)#将光标重置到开始位置
  6. file.write('你好')
  7. file.close()
  8. #此时文件中的只有你好,因为光标重置了,w会清空再写
  • 读写: x+ xb+ xt+ 默认光标位置是开始位置(创建新的文件)
  • 读写: a+ ab+ at+ 默认光标的位置是:末尾
    ```python file = open (‘F:\xuexi\1.txt’,mode = ‘wt+’,encoding=’utf-8’)

file.write(‘你好吗’)

file.seek(0)

file.read()

  1. <a name="834ae468"></a>
  2. ### 4.csv文件操作
  3. ```python
  4. 需要引入os模块
  5. 逗号分隔值,也叫字符分隔值,因为分隔字符可以不是逗号,其文件以纯文本的形式存储表格数据(数字和文本)
  6. 对于这种格式的数据,需要用open()函数来读取文件,并根据逗号分隔的特点来进行处理

练习题案例:下载文档中的所有图片且以用户名为图片名称存储。

  1. ID,用户名,头像
  2. 26044585,Hush,https://hbimg.huabanimg.com/51d46dc32abe7ac7f83b94c67bb88cacc46869954f478-aP4Q3V
  3. 19318369,柒十一,https://hbimg.huabanimg.com/703fdb063bdc37b11033ef794f9b3a7adfa01fd21a6d1-wTFbnO
  1. import os
  2. import requests
  3. with open ("F:\xuexi\1.text",mode = 'r',encoding ='utf-8') as file:
  4. file.reade()
  5. for line in file:
  6. userid ,username,url=line.split(',')
  7. print(username,url)
  8. res = request.get(url = url, headers={
  9. "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"
  10. })
  11. if not os.path.exists("images")
  12. os.makedirs('images')#创建目录
  13. with open ("images\{}.png".format(username),mode='wb') as images_file:
  14. images_file.write(res.content)

5.ini格式文件

ini文件是用于存储软件的配置文件,比如 mysql数据库的配置文件

需要引入 configparser模块

  1. [mysqld] #节点
  2. datadir=/var/lib/mysql
  3. #键 值
  4. socket=/var/lib/mysql/mysql.sock
  5. log-bin=py-mysql-bin
  6. character-set-server=utf8
  7. collation-server=utf8_general_ci
  8. log-error=/var/log/mysqld.log
  9. # Disabling symbolic-links is recommended to prevent assorted security risks
  10. symbolic-links=0
  11. [mysqld_safe]
  12. log-error=/var/log/mariadb/mariadb.log
  13. pid-file=/var/run/mariadb/mariadb.pid
  14. [client]
  15. default-character-set=utf8
  1. import configparser
  2. config = configparser.configparser()
  3. config.read('F:\xuexi\1.ini',encoding='utf-8')
  4. 1.读取所有节点
  5. conu = config.sections()
  6. print(conu)
  7. # ['mysqld','mysqld_safe'.'client']
  8. 2.获取节点下的键值
  9. conu = config.items('client')
  10. print(conu)
  11. #[('log-error','/var/log/mariadb/mariadb.log'),('pid-file','/var/run/mariadb/mariadb.pid')]
  12. for key,values in config.items('mysqld_safe'):
  13. print(key,values)
  14. 3.获取某个节点下的键对应的值
  15. coun = config.get('clinet','default-character-set')
  16. print(coun)
  17. #utf8
  18. 4.是否存在节点
  19. v1 = config.has_section('clinet')
  20. 5.添加一个节点
  21. config.add_section("group")
  22. 6.删除节点
  23. config.remove_section('client')
  24. 7.节点中设置键值
  25. config.set('SEC_1', 'k10', "123")
  26. config.set('SEC_1', 'name', "哈哈哈哈哈")
  27. 7.内容写入文件
  28. config.write(open('files/new.ini', mode='w', encoding='utf-8'))
  29. 9.删除节点中的键值
  30. config.remove_option("mysqld", "datadir")

6.xml格式的文件

可扩展标记语言,数据存储语言,xml被设计用与传输和存储数据

存储: 用来存储配置文件,如 java的配置文件

传输: 网络传输时用这种格式

  1. <data>
  2. <country name="Liechtenstein">
  3. <rank updated="yes">2</rank>
  4. <year>2023</year>
  5. <gdppc>141100</gdppc>
  6. <neighbor direction="E" name="Austria" />
  7. <neighbor direction="W" name="Switzerland" />
  8. </country>
  9. <country name="Singapore">
  10. <rank updated="yes">5</rank>
  11. <year>2026</year>
  12. <gdppc>59900</gdppc>
  13. <neighbor direction="N" name="Malaysia" />
  14. </country>
  15. <country name="Panama">
  16. <rank updated="yes">69</rank>
  17. <year>2026</year>
  18. <gdppc>13600</gdppc>
  19. <neighbor direction="W" name="Costa Rica" />
  20. <neighbor direction="E" name="Colombia" />
  21. </country>
  22. </data>

6.1 读取文件和内容

  1. from xml.etree import ElementTree as ET
  2. # ET去打开xml文件
  3. tree = ET.parse("files/xo.xml")
  4. # 获取根标签
  5. root = tree.getroot()
  6. print(root) # <Element 'data' at 0x7f94e02763b0>
  1. from xml.etree import ElementTree as ET
  2. content = """
  3. <data>
  4. <country name="Liechtenstein">
  5. <rank updated="yes">2</rank>
  6. <year>2023</year>
  7. <gdppc>141100</gdppc>
  8. <neighbor direction="E" name="Austria" />
  9. <neighbor direction="W" name="Switzerland" />
  10. </country>
  11. <country name="Panama">
  12. <rank updated="yes">69</rank>
  13. <year>2026</year>
  14. <gdppc>13600</gdppc>
  15. <neighbor direction="W" name="Costa Rica" />
  16. <neighbor direction="E" name="Colombia" />
  17. </country>
  18. </data>
  19. """
  20. root = ET.XML(content)
  21. print(root) # <Element 'data' at 0x7fdaa019cea0>

6.2 读取节点数据

  1. # 获取根标签
  2. root = ET.xml(content)
  3. print(root) # data
  4. # 获取data标签的孩子标签
  5. for child in root:
  6. # child.tag = conntry
  7. # child.attrib = {"name":"Liechtenstein"}
  8. print(child.tag, child.attrib)
  9. #country {'name': 'Liechtenstein'}
  10. #country {'name': 'Panama'}
  11. for node in child:
  12. print(node.tag, node.attrib, node.text)
  13. """
  14. 输出内容
  15. rank {} 2
  16. year {} 2023
  17. gdppc {} 141100
  18. neighbor {'direction': 'E', 'name': 'Austria'} None
  19. neighbor {'direction': 'W', 'name': 'Switzerland'} None
  20. rank {} 69
  21. year {} 2026
  22. gdppc {} 13600
  23. neighbor {'direction': 'W', 'name': 'Costa Rica'} None
  24. neighbor {'direction': 'E', 'name': 'Colombia'} None
  25. """
  26. root = ET.XML(content)
  27. for child in root.iter('year'):
  28. print(child.tag, child.text)
  29. """
  30. year 2023
  31. year 2026
  32. """
  33. root = ET.XML(content)
  34. v1 = root.findall('country')
  35. print(v1)
  36. v2 = root.find('country').find('rank')
  37. print(v2.text)
  38. """
  39. [<Element 'country' at 0x0000025989E7CB30>, <Element 'country' at 0x0000025989E7CD10>]
  40. 2
  41. """

6.3 修改删除节点

  1. # 修改节点内容和属性
  2. rank = root.find('country').find('rank')
  3. print(rank.text)
  4. rank.text = "999"
  5. rank.set('update', '2020-11-11')
  6. print(rank.text, rank.attrib)
  7. ############ 保存文件 ############
  8. tree = ET.ElementTree(root)
  9. tree.write("new.xml", encoding='utf-8')
  10. # 删除节点
  11. root.remove( root.find('country') )
  12. print(root.findall('country'))
  13. ############ 保存文件 ############
  14. tree = ET.ElementTree(root)
  15. tree.write("newnew.xml", encoding='utf-8')

6.4 构建文档

  1. <home>
  2. <son name="儿1">
  3. <grandson name="儿11"></grandson>
  4. <grandson name="儿12"></grandson>
  5. </son>
  6. <son name="儿2"></son>
  7. </home>
  8. =============================================
  9. from xml.etree import ElementTree as ET
  10. # 创建根标签
  11. root = ET.Element("home")
  12. # 创建节点大儿子
  13. son1 = ET.Element('son', {'name': '儿1'})
  14. # 创建小儿子
  15. son2 = ET.Element('son', {"name": '儿2'})
  16. # 在大儿子中创建两个孙子
  17. grandson1 = ET.Element('grandson', {'name': '儿11'})
  18. grandson2 = ET.Element('grandson', {'name': '儿12'})
  19. son1.append(grandson1)
  20. son1.append(grandson2)
  21. # 把儿子添加到根节点中
  22. root.append(son1)
  23. root.append(son2)
  24. tree = ET.ElementTree(root)
  25. tree.write('oooo.xml', encoding='utf-8', short_empty_elements=False)
  1. <famliy>
  2. <son name="儿1">
  3. <age name="儿11">孙子</age>
  4. </son>
  5. <son name="儿2"></son>
  6. </famliy>
  7. from xml.etree import ElementTree as ET
  8. # 创建根节点
  9. root = ET.Element("famliy")
  10. # 创建节点大儿子
  11. son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
  12. # 创建小儿子
  13. son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})
  14. # 在大儿子中创建一个孙子
  15. grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
  16. grandson1.text = '孙子'
  17. et = ET.ElementTree(root) #生成文档对象
  18. et.write("test.xml", encoding="utf-8")
  1. <user><![CDATA[你好呀]]</user>
  2. from xml.etree import ElementTree as ET
  3. # 创建根节点
  4. root = ET.Element("user")
  5. root.text = "<![CDATA[你好呀]]"
  6. et = ET.ElementTree(root) # 生成文档对象
  7. et.write("test.xml", encoding="utf-8")

7.excel 文件操作

需要引入第三方模块

  1. pip install openpyxl
  2. 模块名称

7.1 读excel load_workbook

  1. from openpyxl import load_workbook
  2. wb = load_workbook("F:\1.xlsx")

7.1.1 获取excel文件中的所有shet名称.sheetnames
  1. wb = load_workbook("F:\1.xlsx")
  2. wb.sheetnames

7.1.2 选择sheet基于名称
  1. sheet = wb["数据导出"]
  2. cell = sheet.cell(1, 2)
  3. print(cell.value)

7.1.3 选择sheet基于索引.worksheets[0]
  1. sheet = wb.worksheets[0]
  2. cell = sheet.cell(1,2)
  3. print(cell.value)

7.1.4 循环所有的sheet
  1. """
  2. for name in wb.sheetnames:
  3. sheet = wb[name]
  4. cell = sheet.cell(1, 1)
  5. print(cell.value)
  6. """
  7. """
  8. for sheet in wb.worksheets:
  9. cell = sheet.cell(1, 1)
  10. print(cell.value)
  11. """
  12. """
  13. for sheet in wb:
  14. cell = sheet.cell(1, 1)
  15. print(cell.value)
  16. """

7.2 读sheet中单元格的数据

  1. from openpyxl import load_workbook
  2. wb = load_workbook("F:\1.xlsx")

7.2.1 获取第n行第n列的单元格(位置从1开始)
  1. cell = sheet.cell(1, 1)
  2. print(cell.value)
  3. print(cell.style)
  4. print(cell.font)
  5. print(cell.alignment)

7.2.2 获取某个单元格
  1. c1 = sheet["A2"]
  2. print(c1.value)
  3. c2 = sheet['D4']
  4. print(c2.value)

7.2.3 获取第n行所有的单元格
  1. for cell in sheet[1]:
  2. print(cell.value)

7.2.4 所有行的数据(获取某一列数据)
  1. for row in sheet.rows:
  2. print(row[0].value, row[1].value)

7.2.5 获取所有列的数据
  1. for col in sheet.columns:
  2. print(col[1].value)

7.2.6 读合并单元格

2.文件操作路径 - 图1

  1. from openpyxl import load_workbook
  2. wb = load_workbook("files/p1.xlsx")
  3. sheet = wb.worksheets[2]
  4. # 获取第N行第N列的单元格(位置是从1开始)
  5. c1 = sheet.cell(1, 1)
  6. print(c1) # <Cell 'Sheet1'.A1>
  7. print(c1.value) # 用户信息
  8. c2 = sheet.cell(1, 2)
  9. print(c2) # <MergedCell 'Sheet1'.B1>
  10. print(c2.value) # None
  1. from openpyxl import load_workbook
  2. wb = load_workbook('files/p1.xlsx')
  3. sheet = wb.worksheets[2]
  4. for row in sheet.rows:
  5. print(row)
  6. """
  7. >>> 输出结果
  8. (<Cell 'Sheet1'.A1>, <MergedCell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)
  9. (<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>)
  10. (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>)
  11. (<MergedCell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>)
  12. (<Cell 'Sheet1'.A5>, <Cell 'Sheet1'.B5>, <Cell 'Sheet1'.C5>)
  13. """

7.3 写excel

7.3.1 在原excel基础上写

  1. from openpyxl import load_workbook
  2. wb = load_workbook('files/p1.xlsx')
  3. sheet = wb.worksheets[0]
  4. # 找到单元格,并修改单元格的内容
  5. cell = sheet.cell(1, 1)
  6. cell.value = "新的开始"
  7. # 将excel文件保存到p2.xlsx文件中
  8. wb.save("files/p2.xlsx")

7.3.2 新创建excel写

  1. from openpyxl import workbook
  2. # 创建excel且默认会创建一个sheet(名称为Sheet)
  3. wb = workbook.Workbook()
  4. sheet = wb.worksheets[0] # 或 sheet = wb["Sheet"]
  5. # 找到单元格,并修改单元格的内容
  6. cell = sheet.cell(1, 1)
  7. cell.value = "新的开始"
  8. # 将excel文件保存到p2.xlsx文件中
  9. wb.save("files/p2.xlsx")

7.3.3 其他操作

  1. # 1. 修改sheet名称
  2. """
  3. sheet = wb.worksheets[0]
  4. sheet.title = "数据集"
  5. wb.save("p2.xlsx")
  6. """
  7. # 2. 创建sheet并设置sheet颜色
  8. """
  9. sheet = wb.create_sheet("工作计划", 0)
  10. sheet.sheet_properties.tabColor = "1072BA"
  11. wb.save("p2.xlsx")
  12. """
  13. # 3. 默认打开的sheet
  14. """
  15. wb.active = 0
  16. wb.save("p2.xlsx")
  17. """
  18. # 4. 拷贝sheet
  19. """
  20. sheet = wb.create_sheet("工作计划")
  21. sheet.sheet_properties.tabColor = "1072BA"
  22. new_sheet = wb.copy_worksheet(wb["Sheet"])
  23. new_sheet.title = "新的计划"
  24. wb.save("p2.xlsx")
  25. """
  26. # 5.删除sheet
  27. """
  28. del wb["用户列表"]
  29. wb.save('files/p2.xlsx')
  30. """
  1. from openpyxl import load_workbook
  2. from openpyxl.styles import Alignment, Border, Side, Font, PatternFill, GradientFill
  3. wb = load_workbook('files/p1.xlsx')
  4. sheet = wb.worksheets[1]
  5. # 1. 获取某个单元格,修改值
  6. """
  7. cell = sheet.cell(1, 1)
  8. cell.value = "开始"
  9. wb.save("p2.xlsx")
  10. """
  11. # 2. 获取某个单元格,修改值
  12. """
  13. sheet["B3"] = "Alex"
  14. wb.save("p2.xlsx")
  15. """
  16. # 3. 获取某些单元格,修改值
  17. """
  18. cell_list = sheet["B2":"C3"]
  19. for row in cell_list:
  20. for cell in row:
  21. cell.value = "新的值"
  22. wb.save("p2.xlsx")
  23. """
  24. # 4. 对齐方式
  25. """
  26. cell = sheet.cell(1, 1)
  27. # horizontal,水平方向对齐方式:"general", "left", "center", "right", "fill", "justify", "centerContinuous", "distributed"
  28. # vertical,垂直方向对齐方式:"top", "center", "bottom", "justify", "distributed"
  29. # text_rotation,旋转角度。
  30. # wrap_text,是否自动换行。
  31. cell.alignment = Alignment(horizontal='center', vertical='distributed', text_rotation=45, wrap_text=True)
  32. wb.save("p2.xlsx")
  33. """
  34. # 5. 边框
  35. # side的style有如下:dashDot','dashDotDot', 'dashed','dotted','double','hair', 'medium', 'mediumDashDot', 'mediumDashDotDot','mediumDashed', 'slantDashDot', 'thick', 'thin'
  36. """
  37. cell = sheet.cell(9, 2)
  38. cell.border = Border(
  39. top=Side(style="thin", color="FFB6C1"),
  40. bottom=Side(style="dashed", color="FFB6C1"),
  41. left=Side(style="dashed", color="FFB6C1"),
  42. right=Side(style="dashed", color="9932CC"),
  43. diagonal=Side(style="thin", color="483D8B"), # 对角线
  44. diagonalUp=True, # 左下 ~ 右上
  45. diagonalDown=True # 左上 ~ 右下
  46. )
  47. wb.save("p2.xlsx")
  48. """
  49. # 6.字体
  50. """
  51. cell = sheet.cell(5, 1)
  52. cell.font = Font(name="微软雅黑", size=45, color="ff0000", underline="single")
  53. wb.save("p2.xlsx")
  54. """
  55. # 7.背景色
  56. """
  57. cell = sheet.cell(5, 3)
  58. cell.fill = PatternFill("solid", fgColor="99ccff")
  59. wb.save("p2.xlsx")
  60. """
  61. # 8.渐变背景色
  62. """
  63. cell = sheet.cell(5, 5)
  64. cell.fill = GradientFill("linear", stop=("FFFFFF", "99ccff", "000000"))
  65. wb.save("p2.xlsx")
  66. """
  67. # 9.宽高(索引从1开始)
  68. """
  69. sheet.row_dimensions[1].height = 50
  70. sheet.column_dimensions["E"].width = 100
  71. wb.save("p2.xlsx")
  72. """
  73. # 10.合并单元格
  74. """
  75. sheet.merge_cells("B2:D8")
  76. sheet.merge_cells(start_row=15, start_column=3, end_row=18, end_column=8)
  77. wb.save("p2.xlsx")
  78. """
  79. """
  80. sheet.unmerge_cells("B2:D8")
  81. wb.save("p2.xlsx")
  82. """
  83. # 11.写入公式
  84. """
  85. sheet = wb.worksheets[3]
  86. sheet["D1"] = "合计"
  87. sheet["D2"] = "=B2*C2"
  88. wb.save("p2.xlsx")
  89. """
  90. """
  91. sheet = wb.worksheets[3]
  92. sheet["D3"] = "=SUM(B3,C3)"
  93. wb.save("p2.xlsx")
  94. """
  95. # 12.删除
  96. """
  97. # idx,要删除的索引位置
  98. # amount,从索引位置开始要删除的个数(默认为1)
  99. sheet.delete_rows(idx=1, amount=20)
  100. sheet.delete_cols(idx=1, amount=3)
  101. wb.save("p2.xlsx")
  102. """
  103. # 13.插入
  104. """
  105. sheet.insert_rows(idx=5, amount=10)
  106. sheet.insert_cols(idx=3, amount=2)
  107. wb.save("p2.xlsx")
  108. """
  109. # 14.循环写内容
  110. """
  111. sheet = wb["Sheet"]
  112. cell_range = sheet['A1:C2']
  113. for row in cell_range:
  114. for cell in row:
  115. cell.value = "xx"
  116. for row in sheet.iter_rows(min_row=5, min_col=1, max_col=7, max_row=10):
  117. for cell in row:
  118. cell.value = "oo"
  119. wb.save("p2.xlsx")
  120. """
  121. # 15.移动
  122. """
  123. # 将H2:J10范围的数据,向右移动15个位置、向上移动1个位置
  124. sheet.move_range("H2:J10",rows=1, cols=15)
  125. wb.save("p2.xlsx")
  126. """
  127. """
  128. sheet = wb.worksheets[3]
  129. sheet["D1"] = "合计"
  130. sheet["D2"] = "=B2*C2"
  131. sheet["D3"] = "=SUM(B3,C3)"
  132. sheet.move_range("B1:D3",cols=10, translate=True) # 自动翻译公式
  133. wb.save("p2.xlsx")
  134. """
  135. # 16.打印区域
  136. """
  137. sheet.print_area = "A1:D200"
  138. wb.save("p2.xlsx")
  139. """
  140. # 17.打印时,每个页面的固定表头
  141. """
  142. sheet.print_title_cols = "A:D"
  143. sheet.print_title_rows = "1:3"
  144. wb.save("p2.xlsx")
  145. """

8.压缩文件

内置的shutil模块可以实现对压缩文件的操作

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

9.路径相关(*)

  1. import shutil
  2. import os
  3. # 1. 获取当前脚本绝对路径
  4. """
  5. abs_path = os.path.abspath(__file__)
  6. print(abs_path)
  7. """
  8. # 2. 获取当前文件的上级目录
  9. """
  10. base_path = os.path.dirname( os.path.dirname(路径) )
  11. print(base_path)
  12. """
  13. # 3. 路径拼接
  14. """
  15. p1 = os.path.join(base_path, 'xx')
  16. print(p1)
  17. p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png')
  18. print(p2)
  19. """
  20. # 4. 判断路径是否存在
  21. """
  22. exists = os.path.exists(p1)
  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. """

10.转义

windows路径使用的是\,linux路径使用的是/。

特别的,在windows系统中如果有这样的一个路径 D:\nxxx\txxx\x1,程序会报错。因为在路径中存在特殊符 \n(换行符)和\t(制表符),Python解释器无法自动区分。

所以,在windows中编写路径时,一般有两种方式:

  • 加转义符,例如:"D:\\nxxx\\txxx\\x1"
  • 路径前加r,例如:`r”D:\nxxx\txxx\x1”