原文作者:我辈理想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
相关的内容比较多,还在整理中
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
从学习python开始,我们就一直在用python的标准库和第三方库。基本的文件操作就是创建、获取、修改和删除。因为文件类型不同(excel、word、ppt、pdf、png、html、eps、gif、mp4、zip等),衍生出了很多第三方库。使用python处理文件是各种python开发岗位都需要的操作。主要涉及到的标准库包括io、os、sys、csv等,涉涉及常用的第三方库包括numpy、pandas、openpyxl、xlwt、xlrd、xlsxwriter、reportlab等,还有一些三方库是只创建生成包括Html2Image、folium等,也有一些库是擅长修改文件比如pillow等,还有就是压缩和解压zlib库。
提示:以下是本篇文章正文内容,下面案例可供参考
所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。实际上文件是我们使用产生的记录信息,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。从不同的角度可对文件作不同的分类。excel、word、ppt、pdf、png、html、eps、gif、mp4、zip等。
其实我们所有看到的内容,都是通过读取文件后的展示出来的。我们需要找到一个我们要操作的文件,文件哪里来呢?第一,我们可以自己创建一个文件;第二,我们可以读取其他人的文件,或者以前创建的文件。
os 模块提供了非常丰富的方法用来处理文件和目录。简单整理了下经常用到的方法,如果想要更深入的可连接菜鸟教程
注:os.getcwd()获取的是执行命令的文件所在位置,不是os.getcwd()所在文件的位置,如果想获取当前文件位置可以使用2的方式
BASE_DIR = os.getcwd()
print(BASE_DIR)
print(type(os.getcwd()))
# 结果
# :\Users\lpf_a\PycharmProjects\ybt_clan\test
#
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
print(BASE_DIR)
print(type(BASE_DIR))
# 结果
# :\Users\lpf_a\PycharmProjects\ybt_clan\test
# class 'pathlib.WindowsPath'>
BASE_DIR = Path(__file__).resolve().parent
files = os.listdir(BASE_DIR)
print(files)
# 结果 ['.git', '.idea', '内存泄漏.py', '文件相关.py', '深度合并dict.py', '电话组合排列.py']
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
files = os.listdir(BASE_DIR)
print(files)
for f in files:
if os.path.splitext(f)[1] == '.py':
print(f)
if f.endswith('泄漏.py'):
print(11)
# 结果
# ['.git', '.idea', '内存泄漏.py', '文件相关.py', '深度合并dict.py', '电话组合排列.py']
# 内存泄漏.py
# 11
# 文件相关.py
# 深度合并dict.py
# 电话组合排列.py
有时我们获取到的路径不是我们想要,需要进行拼接或删减,这是往往为了省事我们使用字符串进行拼接,我们还可以用os提供的os.path方法拼接,建议使用os.path。
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
print(BASE_DIR)
# 获取上一级目录
print(BASE_DIR.parent)
# os.path.join拼接py文件完整路径
print(os.path.join(BASE_DIR, '文件相关.py'))
# str拼接py文件完整路径
uri = os.getcwd() + '\\文件相关.py'
# uri = os.getcwd() + r'\文件相关.py'
print(uri)
# 结果
# C:\Users\lpf_a\PycharmProjects\ybt_clan\test
# C:\Users\lpf_a\PycharmProjects\ybt_clan
# C:\Users\lpf_a\PycharmProjects\ybt_clan\test\文件相关.py
# C:\Users\lpf_a\PycharmProjects\ybt_clan\test\文件相关.py
有时候我们在操作文件路径时,是不知道有没有这个路径的,如果直接使用这个路径会报找不到错误。如果是我们向文件夹中写入内容,我们可以提前创建这个文件夹。如果是查找文件,建议针对路径人工验证,再做处理。
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
print(os.listdir(BASE_DIR))
uri = os.path.join(BASE_DIR, '文件夹')
print(uri)
# 文件路径是否存在
if os.path.exists(uri):
print('文件路径存在')
pass
else:
print('文件路径不存在')
os.mkdir(uri)
# 路径是否是文件
# if os.path.isfile(uri):
# print('文件')
# pass
print(os.listdir(BASE_DIR))
# 结果
# ['.git', '.idea', '内存泄漏.py', '文件相关.py', '深度合并dict.py', '电话组合排列.py']
# C:\Users\lpf_a\PycharmProjects\ybt_clan\test\文件夹
# 不存在
# ['.git', '.idea', '内存泄漏.py', '文件夹', '文件相关.py', '深度合并dict.py', '电话组合排列.py']
import os
from pathlib import Path
def get_file_list(file_path):
# 按照时间排序
dir_list = os.listdir(file_path)
if not dir_list:
return
else:
# 注意,这里使用lambda表达式,将文件按照最后修改时间顺序升序排列
# os.path.getmtime() 函数是获取文件最后修改时间
# os.path.getctime() 函数是获取文件最后创建时间
dir_list = sorted(dir_list, key=lambda x: os.path.getmtime(os.path.join(file_path, x)), reverse=True)
# 返回文件+时间的列表
# dir_list = [[x, os.path.getmtime(os.path.join(file_path, x))] for x in dir_list]
return dir_list
if __name__ == '__main__':
BASE_DIR = Path(__file__).resolve().parent
print(get_file_list(BASE_DIR))
# 结果 ['文件相关.py', '.idea', '.git', '电话组合排列.py', '深度合并dict.py', '内存泄漏.py']
def loop_file(d):
# 获取zip文件的保存路径
file_dict = {}
# zip文件
if os.path.isfile(d):
if d.endswith('.zip'):
file_dict[os.path.splitext(os.path.basename(d))[0]] = d
# 文件夹
else:
directories = os.listdir(d)
for file in directories:
file_dict.update(loop_file(d + '/' + file))
return file_dict
python内置open() 函数,用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。注意:使用 open() 函数一定要保证关闭文件对象,即调用 close() 函数。open的使用一般都是通过with,可以不应每次调用close() 函数。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
文件打开模式 | 含义 | 如果路径不存在 |
---|---|---|
r(只读) | 为了读取,打开一个已存在文件 | 报错 |
w(只写) | 为了写入,打开一个文件 | 建立新文件 |
a (追加) | 向文本文件尾部追加写入,打开一个已存在文件 | 创建新文件 |
所有+b | 已二进制的方式进行rwa | 同rwa模式 |
所有++ | 打开一个文件进行更新(可读可写)。 | 同rwa模式 |
import os
import time
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
print(os.listdir(BASE_DIR))
file = os.path.join(BASE_DIR, 't1.txt')
now_time = time.time()
print(now_time)
with open(file, 'w') as time_file:
time_file.write(str(now_time))
print(os.listdir(BASE_DIR))
# 结果
# 1673177032.08206
# ['.git', '.idea', '内存泄漏.py', '文件夹', '文件相关.py', '深度合并dict.py', '电话组合排列.py']
# ['.git', '.idea', 't1.txt', '内存泄漏.py', '文件夹', '文件相关.py', '深度合并dict.py', '电话组合排列.py']
import os
import time
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
file = os.path.join(BASE_DIR, 't1.txt')
now_time = time.time()
with open(file, 'r') as time_file:
print(time_file.read())
# print(time_file.readlines())
# print(time_file.readline())
# 结果
# 1673177032.08206
import os
import time
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
file = os.path.join(BASE_DIR, 't1.txt')
now_time = time.time()
with open(file, 'a') as time_file:
time_file.write('新增')
# 结果
# 1673177032.08206新增
库名称 | 介绍 | 参考链接 |
---|---|---|
openpyxl | 主要针对xlsx格式的excel进行读取和编辑 | 通过openpyxl 管理像数据库一样管理数据 |
xlrd | 从excel中读取数据,支持xls、xlsx | |
xlwt | 对excel进行修改操作,不支持对xlsx格式的修改 | |
xlsxwriter | 用来生成excel表格,插入数据、插入图标等表格操作,不支持读取 | |
pandas | 以dataframe的格式读取 |
库名称 | 介绍 | 参考链接 |
---|---|---|
docxtpl | 用于读取、写入和创建子文档 | |
python-docx | 用于创建和更新Microsoft Word(.docx)文件的python库 | |
pypiwin32 | 从Python访问许多Windows API的权限 |
Pdf的第三方库推荐使用reportlab,我之前整理了部分reportlab的重要功能,也可以参考官方文档,这里我就不展开介绍了。
库名称 | 介绍 | 参考链接 |
---|---|---|
opencv | 一个 Python 绑定库,旨在解决计算机视觉问题 | |
pillow | 为Python解释器添加了图像处理功能 | |
Html2Image | 一个轻量级的Python包,它作为现有web浏览器无头模式的包装器,从URL和HTML+CSS字符串或文件生成图像 |
库名称 | 介绍 | 参考链接 |
---|---|---|
pymysql | 用于和mysql数据库的交互 | |
sqlalchemy | 用于和mysql数据库的交互 | |
cx_Oracle | 用于和oracle数据库的交互 | |
python-oracledb | 用于和oraclel数据库的交互 | cx_Oracle的升级版,官方文档 |
sqlite3 | 内置库,用于和sqlite数据库的交互 | |
pymongo | 用于和mongodb非关系型数据库的交互 | |
redis、pyredis | 用于和redis非关系型数据库的交互 |
提示:这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了文件操作的使用,整理了日常用到的一些代码,python还有很多相关内容需要去学习。