【Python】文件操作:os标准库和常用第三方库

原文作者:我辈理想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
相关的内容比较多,还在整理中


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、文件是什么?
  • 二、获取文件夹中的文件
    • (一)获取当前文件夹(os、path)
      • 1.通过os.getcwd()获取当前执行文件的位置
      • 2.通过Path获取当前文件夹
    • (二)获取文件夹内的文件
      • 1.获取文件列表
      • 2.获取指定文件(py文件)
    • (三)路径拼接
    • (四)路径合规和创建文件夹
    • (五)按照文件创建和修改时间排序
    • 6. 通过递归获取文件夹下指定文件的字典
  • 三、文件的创建、读取、追加
    • (一)创建文件
    • (二)读取文件
    • (三)追加文件
  • 四、按照文件类型处理文件
    • (一)Excel文件类型
    • (二)Word文件类型
    • (三)Pdf文件类型
    • (四)Img文件类型
    • (五)数据库文件类型
  • 总结


前言

从学习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、path)

注:os.getcwd()获取的是执行命令的文件所在位置,不是os.getcwd()所在文件的位置,如果想获取当前文件位置可以使用2的方式

1.通过os.getcwd()获取当前执行文件的位置

BASE_DIR = os.getcwd()
print(BASE_DIR)
print(type(os.getcwd()))
# 结果 
# :\Users\lpf_a\PycharmProjects\ybt_clan\test
# 

2.通过Path获取当前文件夹

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'>

(二)获取文件夹内的文件

1.获取文件列表

BASE_DIR = Path(__file__).resolve().parent
files = os.listdir(BASE_DIR)
print(files)
# 结果 ['.git', '.idea', '内存泄漏.py', '文件相关.py', '深度合并dict.py', '电话组合排列.py']

2.获取指定文件(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']

6. 通过递归获取文件夹下指定文件的字典

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新增

四、按照文件类型处理文件

(一)Excel文件类型

库名称 介绍 参考链接
openpyxl 主要针对xlsx格式的excel进行读取和编辑 通过openpyxl 管理像数据库一样管理数据
xlrd 从excel中读取数据,支持xls、xlsx
xlwt 对excel进行修改操作,不支持对xlsx格式的修改
xlsxwriter 用来生成excel表格,插入数据、插入图标等表格操作,不支持读取
pandas 以dataframe的格式读取

(二)Word文件类型

库名称 介绍 参考链接
docxtpl 用于读取、写入和创建子文档
python-docx 用于创建和更新Microsoft Word(.docx)文件的python库
pypiwin32 从Python访问许多Windows API的权限

(三)Pdf文件类型

Pdf的第三方库推荐使用reportlab,我之前整理了部分reportlab的重要功能,也可以参考官方文档,这里我就不展开介绍了。

(四)Img文件类型

库名称 介绍 参考链接
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还有很多相关内容需要去学习。

你可能感兴趣的:(Python开始入门,python,开发语言)