Python基础 - 文件处理(下)
主要是介绍两个文件处理的内置模块 os, pathlib. 上篇对文件的读写基本搞定了. 当然, 因为我做数据的嘛, 我的日常并不是简单的读写下文件, 而是重在读取数据后, 各种复杂的操作. 用到的更多是 pandas 这样的库来做数据分析. 也因为强大的 pandas, 其实比 excel 更加灵活和强大, 也是我以前做 办公自动化的首先工具.
还是回到正题, 文件处理. 通常就是获取一个文件夹下的所有文件, 或者提取特定文件, 读取数据, 创建文件夹, 文件这些繁琐的事情, 其实也不是很难, 逻辑清楚了, 边用边百度就能搞定.
OS
也只是一常用到的函数.
常用的-增删改查
import os
# 获取当前路径
os.getcwd()
'E:\\Jupyter notes\\Python_data_struct'
# 获取某路径下的所有文件
os.listdir()
['.git', '.gitignore', '.idea', 'pythonds', 'test.py', 'test2.py', 'test副本py']
# 删除文件
os.remove('test副本py')
os.listdir()
['.git', '.gitignore', '.idea', 'pythonds', 'test.py', 'test2.py']
# 判断某文件是否存在
if os.path.exists("hello.py"):
print("yes")
else:
print('no')
no
# 创建文件夹
os.mkdir('my_dir')
os.listdir()
['.git', '.gitignore', '.idea', 'my_dir', 'pythonds', 'test.py', 'test2.py']
# 改变目录
os.chdir(path)
栗子 - 判断文件
import os
def file_check():
# 获取当目录下的所有文件
file_list = os.listdir(os.getcwd())
if not file_list:
return
for file in file_list:
if os.path.isdir(file):
print(file, 'is a dir')
elif os.path.isfile(file):
print(file, 'is a file')
elif os.path.islink(file):
print(file, 'is a link')
else:
print(file, 'en, en , en')
if __name__ == '__main__':
file_check()
.git is a dir
.gitignore is a file
.idea is a dir
my_dir is a dir
pythonds is a dir
test.py is a file
test2.py is a file
最直接的用, 用过 linux 就知道, 最为常见的命令, 不就是 ls 嘛. 不就是 这里的 os.listdir() 呀. 一样的功能. 然后判断时是否是文件, 还是文件夹, 若为文件夹, 则继续 ls ... 想想, 这不就是一个递归的过程嘛, 什么批量改名文件, 什么多层目录文件递归拷贝, 都是一样的逻辑, 蛮简单的, 不想写了, 有个印象就行, 还是重点在于库的大概知道就好.
glob
这个内置模块, 就专门用来, 查找特定文件的, 简直无敌强. 文档是这样说的, 非常详细.
比如上栗, 就不用遍历整个目录判断每个文件是不是符合。
The glob
module finds all the pathnames matching a specified pattern according to the rules used by the Unix shell, although results are returned in arbitrary order. No tilde expansion is done, but *
, ?
, and character ranges expressed with []
will be correctly matched. This is done by using the os.scandir()
and fnmatch.fnmatch()
functions in concert, and not by actually invoking a subshell. Note that unlike fnmatch.fnmatch()
, glob
treats filenames beginning with a dot (.
) as special cases. (For tilde and shell variable expansion, use os.path.expanduser()
and os.path.expandvars()
.)
我看了下它的源代码, 其实就是用 re 和 os 的部分功能封装而已, 也不是说很厉害的样子.
”*” 匹配0个或多个字符;
”?” 匹配单个字符;
”[ ]” 匹配指定范围内的字符,如:[0-9]匹配数字。
import glob
# 匹配当前所有的文件
glob.glob("*")
['123.txt', 'my_dir', 'pythonds', 'test.py', 'test2.py']
# my_dir 文件夹下的所有文件, 不存在则 [], 不报错
glob.glob('my_dir/*')
['my_dir\\a.txt', 'my_dir\\b.txt', 'my_dir\\c_dir']
# 匹配出当前所有后缀为 .txt 的文件
glob.glob('*.txt')
['123.txt', '测试.txt']
# 特定文件名的
glob.glob('12*.txt')
['123.txt']
# 以迭代器的方式, 不用一下全查出来, 节省内存
g = glob.iglob('*.txt')
g
<generator object _iglob at 0x000001E652CFA360>
list(g)
['123.txt', '测试.txt']
基本常用的文件操作也就这些.
pathlib
从3.4以后, 说是 面向对象的文件系统路径. 用得多一点就是里面的 Path 类多一些.
对于底层的路径字符串操作,你也可以使用
os.path
模块。
也不算是对 os.path 的完善啥的, 就使用上更加 pythonic 一点, 网上找了一些栗子参考一波就行了, 用到可在看看文档即可.
令人困惑的 os.path.join()
每次字符串拼接,我都要先测试一波, 就从未记住过. 跟 json 的 dumps(), loads() 一样的, 从未记住, 只能测试.
# 字符串 -> 列表 => split()
lst = "I am little prince".split()
print(lst)
# 列表 -> 字符 => join()
my_str = ', '.join(lst)
print(my_str)
['I', 'am', 'little', 'prince']
I, am, little, prince
import os.path
# 创建文件夹 src, 里面再建一个 demo 文件夹
os.makedirs(os.path.join('src', 'demo'), exist_ok=True)
# 123.txt 不存在则报错. 并其路径改为 src/123.txt (文件改名和移动)
os.rename('123.txt', os.path.join('src', '1234.txt'))
join() 是真的容易被搞混淆的一个函数哦. 同样的功能, 用 pathlib 则就非常优雅了.
from pathlib import Path
Path('src/demo').mkdir(parents=True, exist_ok=True)
# 重命名文件 并 移动
Path('123.txt').rename('src/1234.txt')
这种面向对象的风格, 真实太爽了.
# Path(Purpath) 默认的是纯路径, 但我就是要相对路径, 这暂时不知咋弄.
g = Path.cwd().glob('*.txt')
list(g)
[WindowsPath('E:/Jupyter notes/Python_data_struct/测试.txt')]
... 暂时不举例了.. 有个印象就行了.
对于文件处理, 不就是这写读写文件, 文件判断这些嘛, 假设中间的数据处理, 这其实就是文件批处理和自动化呀. 我感觉, 后面我单独搞一波分支,专门来搞办公自动化, 应该可以..文件操作就暂时这样吧.
Python基础 - 文件处理(下)的更多相关文章
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- python 基础-文件读写'r' 和 'rb'区别
原文链接: python基础-文件读写'r' 和 'rb'区别 一.Python文件读写的几种模式: r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别在哪里呢? 1.文件使用方式标识 'r ...
- python遍历文件夹下的文件
在读文件的时候往往需要遍历文件夹,python的os.path包含了很多文件.文件夹操作的方法.下面列出: os.path.abspath(path) #返回绝对路径 os.path.basename ...
- python 读取文件夹下的图片进行处理
python的os模块中有一个listdir函数可以遍历读取文件夹下的文件. import os for filename in os.listdir(r"./file"): #l ...
- python 遍历文件夹下的所有文件
基础 import os # 遍历文件夹 def walkFile(file): for root, dirs, files in os.walk(file): # root 表示当前正在访问的文件夹 ...
- Python将文件夹下的文件名写入excel方便统计
如题,贴代码: 1 ''' 2 #python将某文件夹下的文件名存储到excel中 3 ''' 4 5 #导入所需模块 6 import os 7 import xlwt 8 9 #定义要处理的文件 ...
- python 查找文件夹下以特定字符开头的某类型文件 - os.walk
Python os.walk() 方法 os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下.os.walk() 方法是一个简单易用的文件.目录遍历器,可以帮助我们高效的处 ...
- python 替换 文件夹下的 文件名称 及 文件内容
示例效果: 1.替换某文件夹下的 文件夹及子文件夹 的名称 由OldStrDir 变为 NewStrDir: 2.替换某文件夹下的 文件夹及子文件夹 下 所有的文件的名称 由OldStrFile 变为 ...
- Python基础--文件操作和集合
这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件file.txt: 我们哭了 ...
- python基础--文件操作实现全文或单行替换
python修改文件时,使用w模式会将原本的文件清空/覆盖.可以先用读(r)的方式打开,写到内存中,然后再用写(w)的方式打开. 替换文本中的taste 为 tasting Yesterday whe ...
随机推荐
- Jquery常用小操作
Jq常用操作 jQuery:jQuery 是一个高效.精简并且功能丰富的 JavaScript 工具库 概念1: jQuery对象与Dom对象的区别 jQuery 的对象才可以使用 jQuery 的方 ...
- 【最佳方案】RAG 技术深度剖析及 MaxKB 在企业 AI 落地中的应用策略
RAG 已经成为 LLM 大语言模型在企业落地的最佳方案,其中主要是因为 RAG 能够解决幻觉问题.时效性问题以及数据安全问题. 解决幻觉问题: LLM 文本生成的底层原理是基于概率的 token b ...
- 《uTools:提升效率的神奇工具》
utools5.0 一.引言 在如今快节奏的工作和生活中,我们都在寻找能够帮助我们节省时间.提高效率的工具.uTools 就是这样一款令人惊艳的工具,它为我的日常带来了极大的便利. 相关链接:uToo ...
- 普通文本(.txt)篇章排版样式参考 [文档说明][日志]
把普通文本的篇章排版样式归总一下,供自己参考,当然如果读者能以此借鉴并学习到一些东西,是笔者最大的鼓励. 日志类 [1] 头标 [时间日期][备注][属性]内容 [2] [文件信息][符号][文件信息 ...
- 「二」移动光标、vim进入与退出、文本编辑之删除、插入、添加、编辑、光标移动、撤销
移动光标 h:向左移动 j:向下移动 k:向上移动 l:向右移动 vim进入与退出 按鍵, 确保处于正常模式 輸入:q! <回车>(丢弃所做的任何改动) 文本编辑之删除 在正常模式下修改命 ...
- 自己写的第一个java项目!
项目名为"零钱通" 细节参考 [零基础 快速学Java]韩顺平 零基础30天学会Java 基本版: 1 package project; 2 3 import java.text. ...
- 三分钟构建高性能WebSocket服务 | 超优雅的Springboot整合Netty方案
前言 每当使用SpringBoot进行Weboscket开发时,最容易想到的就是spring-boot-starter-websocket(或spring-websocket).它可以让我们使用注解, ...
- vue 保留两位小数
前言 有时候我们需要对各种数值进行保留位数,以便于更好的展示. Html部分 template中这样使用,需要处理的字段名,再加上过滤器方法 <div class="text prim ...
- 编写你的第一个 Django 应用程序,第4部分
本教程从教程 3 停止的地方开始.我们是 继续民意调查应用程序,并将专注于表单处理和 减少我们的代码. 一.编写最小表单 让我们更新上一个教程的投票详细信息模板("polls/detail. ...
- 使用`forEach`方法前后的代码逐步简化过程
简化前的完整循环代码 首先,我们使用传统的for-each循环遍历HashMap: import java.util.HashMap; import java.util.Map; public cla ...