一篇文章搞定Python操作文件与目录


Posted in Python onAugust 13, 2019

前言

文件和目录操作是很常见的功能,这里做个简单的总结,包括注意事项和实际的实现代码,基本日常开发都够用了

目录操作

判断目录或是文件是否存在

os.path.exists(path)

判断是否是文件或是目录

# 如果文件或是目录不存在也会返回False
os.path.isfile(path)
os.path.isdir(path)

创建/删除目录

os.mkdir(path)
os.rmdir(path)

得到当前的目录名称

os.path.split(dir_path)[1]

这个方法既简单又实用,比如我们输入一个目录路径:

os.path.split('/usr/projects/project1')[1]
# 输出
project1

# 实际上,上面的代码是分了2步走:
# 第1步:利用os.path.split方法分割路径
os.path.split('/usr/projects/project1')
# 输出
('/usr/projects', 'project1')
# 然后第2步取出第2个结果,也就是当前的目录名字

循环遍历目录

循环遍历目录有2种方式,一种是常规的递归方法,类似下面这样:

def list_file(path):
 for file in os.listdir(path):
  if os.path.isdir(os.path.join(path, file)):
   list_file(os.path.join(path, file))
  print(file)

还有一种更好的方式就是用os.walk方法,类似下面这样:

def list_file_by_walk(dir_path):
 for home, dirs, files in os.walk(dir_path):
  print(home)
  print(dirs)
  # files中是文件列表
  for file_name in files:
   print(file_name)

os.walk方法的几个参数简单介绍一下:

  • home:这个是当前遍历的目录,比如说是 /usr/projects/
  • dirs:是这个目录(home目录)下面的所有文件夹(也就是子目录)
  • files:是这个目录(home目录)下所有的文件

所以从上面的参数中可以看出,os.walk方法会逐一地遍历初始目录下面的所有目录和文件

常见的文件操作

跟上面得到目录名类似的是得到文件的后缀

os.path.splitext(file_path)

这个方法如果输入的是文件的路径,比如:

a = '/usr/projects/project1/test.txt'
os.path.splitext(a)
# 输出
('/usr/projects/project1/test', '.txt')
# 所以跟上面类似,我们可以直接拿到文件的后缀
os.path.splitext(a)[1]

文件的全路径

# 需要文件的目录路径和文件名
os.path.join(dir_name, file_name)

这个方法也很有用,因为我们在打开一个文件的时候都需要知道文件的路径

比如在上面循环遍历目录的例子中,我们可以这样打开编辑文件:

def list_file_by_walk(dir_path):
  for home, dirs, files in os.walk(dir_path):
    print(home)
    print(dirs)
    # files中是文件列表
    for file_name in files:
      # 这个file_name只是一个文件名
      print(file_name)
      # 如果我们需要打开文件进行编辑读写操作,那就需要文件的路径
      # 用os.path.join方法就可以快速得到文件路径
      file_path = os.path.join(home, file_name)

需要注意的是,不要直接用字符串相加的方式来拼接,这样子会有兼容问题,比如windows上可能路径就是错的了

读写文件

打开文件

with open(file, 'r') as f:
  for line in f.readlines():
    print line

大家只要记住上面打开文件的格式就行了,也就是这句:

with open(file_path, 打开的模式) as f
# 我们就拿到了文件对象f,可以对文件进行操作了,比如读写等

原因是文件读写是IO操作,需要及时关闭打开的文件,上述with open() as f的方式会自动帮你关闭文件的,免得自己忘记关

文件的打开模式

文件的打开模式有很多种,比如只读、只写、追加模式等等,具体可以见下图:

一篇文章搞定Python操作文件与目录
文件读写模式--来源于网络

模式有这么多,掌握常见的几种就可以了,其他的等用到了再去了解。需要注意以下几点:

创建文件,只需要打开一个文件即可:

# 只要这样一句就创建了一个新文件,也就是打开以后关闭文件
with open(new_file, 'w') as f:

需要特别注意的是,以w只写模式打开一个文件后会把原文件的内容清除!所以如果在遍历文件的时候,你想同时修改文件就不能简单的以w只写模式打开了。

在遍历文件的时候想同时修改文件怎么办呢?注意这里说的是修改,比如修改某一行。

修改文件的某一部分

这里举例在遍历文件的时候想修改文件,比如以上面遍历目录文件的例子:

def list_file_by_walk(dir_path):
  for home, dirs, files in os.walk(dir_path):
    print(home)
    print(dirs)
    # files中是文件列表
    for file_name in files:
      # 这个file_name只是一个文件名
      print(file_name)
      # 如果我们需要打开文件进行编辑读写操作,那就需要文件的路径
      # 用os.path.join方法就可以快速得到文件路径
      file_path = os.path.join(home, file_name)
      
      # 这个时候我想修改这个文件的内容,要怎么做呢?

需要注意的是,读写模式需要管理文件指针,比较麻烦,写读模式,则会把原先的内容都清除,所以都不适合

一种思路是我先以只读模式打开,然后遍历文件的内容保存起来,比如:

with open(file, 'r') as f:
  for line in f.readlines():
    print line
    # 这里就可以把文件的内容一行行保存起来
    # 找到需要修改的行,修改以后保存

保存以后再以只读模式打开文件,写入即可。

另一种思路是我打开原文件的同时,再打开另一个临时文件用于写入,比如这样:

with open(file, 'r') as f, open(cache_file_path, 'w') as w:
  for line in f.readlines():
    # 中间可以对f文件中的内容进行过滤或是修改
    w.write(line)

# 完了以后需要删除原文件,然后把临时文件的名字修改成原来文件的名字即可

这里就顺道引出了,删除和重命名文件的方法

os.remove(file)
os.rename(cache_file_path, file)

总结

以上就是Python文件和目录操作的常用知识点和方法总结,建议大家收藏起来,以后方便随时查看。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Django中使用locals()函数的技巧
Jul 16 Python
Python手机号码归属地查询代码
May 04 Python
Python常用库推荐
Dec 04 Python
轻松理解Python 中的 descriptor
Sep 15 Python
Python操作Sql Server 2008数据库的方法详解
May 17 Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
PyQt5下拉式复选框QComboCheckBox的实例
Jun 25 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
利用python实现逐步回归
Feb 24 Python
什么是python的必选参数
Jun 21 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 Python
Python Django Cookie 简单用法解析
Aug 13 #Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 #Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 #Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 #Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 #Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 #Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 #Python
You might like
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
ScrollDown的基本操作示例
2013/06/09 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
loading动画特效小结
2017/01/22 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
vue跳转方式(打开新页面)及传参操作示例
2020/01/26 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
Python将列表数据写入文件(txt, csv,excel)
2019/04/03 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
金融管理应届生求职信
2014/02/20 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
经济职业学院毕业生自荐书
2014/03/17 职场文书
目标责任书范本
2014/04/16 职场文书
12岁生日演讲稿
2014/05/14 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书