学习目标:
了解常见的csv
、excel
、ini
文件的相关操作,熟悉文件压缩的方法,掌握路径相关的概念和操作。不要求记住每一种文件的具体操作方法,但要做好笔记,以备将来查阅。
一、CSV文件
1. CSV文件介绍
CSV(Comma Separated Values)全称逗号分隔值文件是一种简单、通用的文件格式,被广泛的应用于应用程序(数据库、电子表格等)数据的导入和导出以及异构系统之间的数据交换。因为CSV是纯文本文件,不管是什么操作系统和编程语言都是可以处理纯文本的,而且很多编程语言中都提供了对读写CSV文件的支持,因此CSV格式在数据处理和数据科学中被广泛应用。
CSV文件有以下特点:
- 纯文本,使用某种字符集(如ASCII、Unicode、GB2312)等);
- 由一条条的记录组成(典型的是每行一条记录);
- 每条记录被分隔符(如逗号、分号、制表符等)分隔为字段(列);
- 每条记录都有同样的字段序列。
CSV文件可以使用文本编辑器或类似于Excel电子表格这类工具打开和编辑,当使用Excel这类电子表格打开CSV文件时,你甚至感觉不到CSV和Excel文件的区别。很多数据库系统都支持将数据导出到CSV文件中,当然也支持从CSV文件中读入数据保存到数据库中,这些内容并不是我们这里讨论的重点。
2. 将数据写入CSV文件
现有五个学生三门课程的考试成绩需要保存到一个CSV文件中,要达成这个目标,可以使用Python标准库中的csv
模块,该模块的writer
函数会返回一个csvwriter
对象,通过该对象的writerow
或writerows
方法就可以将数据写入到CSV文件中,具体的代码如下所示。
1 | import csv |
需要说明的是上面的writer
函数,该函数除了传入要写入数据的文件对象外,还可以dialect
参数,它表示CSV文件的方言,默认值是excel
。除此之外,还可以通过delimiter
、quotechar
、quoting
参数来指定分隔符(默认是逗号)、包围值的字符(默认是双引号)以及包围的方式。其中,包围值的字符主要用于当字段中有特殊符号时,通过添加包围值的字符可以避免二义性。大家可以尝试将上面第5行代码修改为下面的代码,看看生成的CSV文件到底有什么区别。
1 | writer = csv.writer(file, delimiter='|', quoting=csv.QUOTE_ALL) |
3. 从CSV文件读取数据
如果要读取刚才创建的CSV文件,可以使用下面的代码,通过csv
模块的reader
函数可以创建出csvreader
对象,该对象是一个迭代器,可以通过next
函数或for-in
循环读取到文件中的数据。
1 | import csv |
注意:上面的代码对
csvreader
对象做for
循环时,每次会取出一个列表对象,该列表对象包含了一行中所有的字段。
4. 练习题案例
当然,利用上一节学过的Python的内置文件读写函数也可以完成对csv文件的读写操作,请看下面的示例。
要求:下载文档中的所有图片且以用户名为图片名称存储。
1 | ID,用户名,头像 |
代码实现示例
1 | import os |
练习:请用csv
模块对上述示例进行修改。
二、ini格式文件
ini文件是Initialization File的缩写,平时用于存储软件的的配置文件。例如:MySQL数据库的配置文件。
1 | [mysqld] |
这种格式是可以直接使用open来出来,考虑到自己处理比较麻烦,所以Python为我们提供了更为方便的方式。
1 | import configparser |
读取所有节点
1
2
3
4
5
6
7
8
9
10import configparser
config = configparser.ConfigParser()
config.read('files/my.conf', encoding='utf-8')
# config.read('my.conf', encoding='utf-8')
ret = config.sections()
print(ret)
>>输出
['mysqld', 'mysqld_safe', 'client']读取节点下的键值
1
2
3
4
5
6
7
8
9
10import configparser
config = configparser.ConfigParser()
config.read('files/my.conf', encoding='utf-8')
# config.read('my.conf', encoding='utf-8')
item_list = config.items("mysqld_safe")
print(item_list)
>>输出
[('log-error', '/var/log/mariadb/mariadb.log'), ('pid-file', '/var/run/mariadb/mariadb.pid')]读取节点下值(根据 节点+键 )
1
2
3
4
5
6
7
8
9
10import configparser
config = configparser.ConfigParser()
config.read('files/my.conf', encoding='utf-8')
value = config.get('mysqld', 'log-bin')
print(value)
>>输出
py-mysql-bin检查、删除、添加节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import configparser
config = configparser.ConfigParser()
config.read('files/my.conf', 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('files/xxoo.conf', 'w'))
# 删除节点
config.remove_section("SEC_2")
# 删除节点中的键值
config.remove_option('SEC_1', 'k10')
config.write(open('files/new.conf', 'w'))
三、Excel格式文件
Python内部未提供处理Excel文件的功能,想要在Python中操作Excel需要按照第三方的模块。
1 | pip install openpyxl |
此模块中集成了Python操作Excel的相关功能,接下来我们就需要去学习该模块提供的相关功能即可。
1. 读Excel
读sheet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42from openpyxl import load_workbook
wb = load_workbook("files/p1.xlsx")
# sheet相关操作
# 1.获取excel文件中的所有sheet名称
"""
print(wb.sheetnames) # ['数据导出', '用户列表', 'Sheet1', 'Sheet2']
"""
# 2.选择sheet,基于sheet名称
"""
sheet = wb["数据导出"]
cell = sheet.cell(1, 2)
print(cell.value)
"""
# 3.选择sheet,基于索引位置
"""
sheet = wb.worksheets[0]
cell = sheet.cell(1,2)
print(cell.value)
"""
# 4.循环所有的sheet
"""
for name in wb.sheetnames:
sheet = wb[name]
cell = sheet.cell(1, 1)
print(cell.value)
"""
"""
for sheet in wb.worksheets:
cell = sheet.cell(1, 1)
print(cell.value)
"""
"""
for sheet in wb:
cell = sheet.cell(1, 1)
print(cell.value)
"""读sheet中单元格的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41from openpyxl import load_workbook
wb = load_workbook("files/p1.xlsx")
sheet = wb.worksheets[0]
# 1.获取第N行第N列的单元格(位置是从1开始)
"""
cell = sheet.cell(1, 1)
print(cell.value)
print(cell.style)
print(cell.font)
print(cell.alignment)
"""
# 2.获取某个单元格
"""
c1 = sheet["A2"]
print(c1.value)
c2 = sheet['D4']
print(c2.value)
"""
# 3.第N行所有的单元格
"""
for cell in sheet[1]:
print(cell.value)
"""
# 4.所有行的数据(获取某一列数据)
"""
for row in sheet.rows:
print(row[0].value, row[1].value)
"""
# 5.获取所有列的数据
"""
for col in sheet.columns:
print(col[1].value)
"""读合并的单元格
1
2
3
4
5
6
7
8
9
10
11
12
13from openpyxl import load_workbook
wb = load_workbook("files/p1.xlsx")
sheet = wb.worksheets[2]
# 获取第N行第N列的单元格(位置是从1开始)
c1 = sheet.cell(1, 1)
print(c1) # <Cell 'Sheet1'.A1>
print(c1.value) # 用户信息
c2 = sheet.cell(1, 2)
print(c2) # <MergedCell 'Sheet1'.B1>
print(c2.value) # None1
2
3
4
5
6from openpyxl import load_workbook
wb = load_workbook('files/p1.xlsx')
sheet = wb.worksheets[2]
for row in sheet.rows:
print(row)1
2
3
4
5
6输出结果
(<Cell 'Sheet1'.A1>, <MergedCell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)
(<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>)
(<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>)
(<MergedCell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>)
(<Cell 'Sheet1'.A5>, <Cell 'Sheet1'.B5>, <Cell 'Sheet1'.C5>)
2. 写Excel
在Excel中想要写文件,大致要分为在:
原Excel文件基础上写内容。
1
2
3
4
5
6
7
8
9
10
11from openpyxl import load_workbook
wb = load_workbook('files/p1.xlsx')
sheet = wb.worksheets[0]
# 找到单元格,并修改单元格的内容
cell = sheet.cell(1, 1)
cell.value = "新的开始"
# 将excel文件保存到p2.xlsx文件中
wb.save("files/p2.xlsx")新创建Excel文件写内容。
1
2
3
4
5
6
7
8
9
10
11
12
13from openpyxl import workbook
# 创建excel且默认会创建一个sheet(名称为Sheet)
wb = workbook.Workbook()
sheet = wb.worksheets[0] # 或 sheet = wb["Sheet"]
# 找到单元格,并修改单元格的内容
cell = sheet.cell(1, 1)
cell.value = "新的开始"
# 将excel文件保存到p2.xlsx文件中
wb.save("files/p2.xlsx")
在了解了如何读取Excel和创建Excel之后,后续对于Excel中的sheet和cell操作基本上都相同。
表格相关操作
导入模块
1
from openpyxl import workbook
初始化
1
wb = workbook.Workbook() # Sheet
修改sheet名称
1
2
3sheet = wb.worksheets[0]
sheet.title = "数据集"
wb.save("p2.xlsx")创建sheet并设置sheet颜色
1
2
3sheet = wb.create_sheet("工作计划", 0)
sheet.sheet_properties.tabColor = "1072BA"
wb.save("p2.xlsx")默认打开的sheet
1
2wb.active = 0
wb.save("p2.xlsx")拷贝sheet
1
2
3
4
5
6sheet = wb.create_sheet("工作计划")
sheet.sheet_properties.tabColor = "1072BA"
new_sheet = wb.copy_worksheet(wb["Sheet"])
new_sheet.title = "新的计划"
wb.save("p2.xlsx")删除sheet
1
2del wb["用户列表"]
wb.save('files/p2.xlsx')
单元格相关操作
1 | from openpyxl import load_workbook |
四、压缩文件
基于Python内置的shutil
模块可以实现对压缩文件的操作。
1 | import shutil |
五、路径相关
1. 转义
windows路径使用的是\,linux
路径使用的是/。
特别的,在windows系统中如果有这样的一个路径 D:\nxxx\txxx\x1
,程序会报错。因为在路径中存在特殊符 \n
(换行符)和\t
(制表符),Python解释器无法自动区分。
所以,在windows中编写路径时,一般有两种方式:
- 加转义符,例如:
"D:\\nxxx\\txxx\\x1"
- 路径前加r,例如:
r"D:\\nxxx\\txxx\\x1"
2. 程序当前路径
项目中如果使用了相对路径,那么一定要注意当前所在的位置。
例如:在G:/学习/Python学习\Python基础/code
路径下编写 demo.py
文件
1 | with open("a1.txt", mode='w', encoding='utf-8') as f: |
用以下两种方式去运行:
方式1,文件会创建在
G:/学习/Python学习/Python基础/code
目录下。1
2cd G:/学习/Python学习/Python基础/code
python demo.py方式2,文件会创建在
G:/学习
目录下。1
2cd G:/学习
python `G:/学习/Python学习/Python基础/code/demo.py
实际开发使用示例
1 | import os |
3. 文件和路径相关
导入相关模块
1
2import shutil
import os获取当前脚本绝对路径
1
2abs_path = os.path.abspath(__file__)
print(abs_path)获取当前文件的上级目录
1
2base_path = os.path.dirname( os.path.dirname(路径) )
print(base_path)路径拼接
1
2
3
4
5p1 = os.path.join(base_path, 'xx')
print(p1)
p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png')
print(p2)判断路径是否存在
1
2exists = os.path.exists(p1)
print(exists)创建文件夹
1
os.makedirs(路径)
1
2
3path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
if not os.path.exists(path):
os.makedirs(path)判断是否是文件夹
1
2
3
4
5
6
7file_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删除文件或文件夹
1
os.remove("文件路径")
1
2path = os.path.join(base_path, 'xx')
shutil.rmtree(path)拷贝文件夹
1
shutil.copytree("D:/data/files","E:/data/files")
拷贝文件
1
2shutil.copy("D:/data/xx.png","E:/data/")
shutil.copy("D:/data/xx.png","E:/data/yy.png")文件或文件夹重命名
1
2shutil.move("D:/data/xx.png","D:/data/xx2.png")
shutil.move("D:/data/files","D:/data/images")
六、简单的总结
上一节和本节我们主要围绕着常见文件相关操作来展开进行讲解,让大家能够基于Python处理不同格式的文件。由于涉及的知识点比较多,所以这两节的内容学起来会比较耗时,但都比较简单,只需要理解并编写好相关笔记以便后期开发时翻阅。最后再次强调一下文件处理时的注意问题:
文件相对路径,在使用相对路径时可能会执行程序的目录不同,导致路径出问题。所以,如若使用相对路径请务必清楚当前运行程序所在目录。
文件绝对路径(推荐),不要将文件路径写死,而是基于 os 模块中的相关功能自动化获取绝对路径,以方便项目移动到其他文件或电脑上。
1
2
3import os
base_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(base_dir, 'files', 'info.txt')路径转义
- 手动写路径,需要自己在路径中添加 r 或 加入 \ 来进行处理。
- 基于os.path.join拼接,内部自动处理,不需要手动处理。
内置函数、内置模块、第三方模块的区别?
如何去下载安装第三方模块?
1
pip install 模块名称
- requests模块,可以用来发送网络请求。
- openpyxl模块,处理Excel格式的文件。
基本文件的读写、打开模式、上下文管理。
其他格式:csv、ini、excel格式的处理(无序记忆,做好笔记即可)。
将来如果大家使用Python做数据分析,很有可能会用到名为pandas
的三方库,它是Python数据分析的神器之一。它能够轻松处理csv、excel等各种常见格式的数据,完成各种复杂的操作,尤其对于大文件优势更加明显。后期我会出一个pandas
系列的文章,到时候可以领略它的神奇。