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

前言

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

目录操作

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

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的方式会自动帮你关闭文件的,免得自己忘记关

文件的打开模式

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


文件读写模式--来源于网络

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

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

# 只要这样一句就创建了一个新文件,也就是打开以后关闭文件
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文件和目录操作的常用知识点和方法总结,建议大家收藏起来,以后方便随时查看。

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

(0)

相关推荐

  • 在Python中操作文件之read()方法的使用教程

    read()方法读取文件size个字节大小.如果读取命中获得EOF大小字节之前,那么它只能读取可用的字节. 语法 以下是read()方法的语法: fileObject.read( size ); 参数 size -- 这是可以从文件中读取的字节数. 返回值 此方法返回读取字符串中的字节数. 例子 下面的例子显示了read()方法的使用. #!/usr/bin/python # Open a file fo = open("foo.txt", "rw+") print

  • python中os操作文件及文件路径实例汇总

    本文实例讲述了python中os操作文件及文件路径的方法.分享给大家供大家参考.具体分析如下: python获取文件上一级目录:取文件所在目录的上一级目录 复制代码 代码如下: os.path.abspath(os.path.join(os.path.dirname('settings.py'),os.path.pardir)) os.path.pardir是父目录,os.path.abspath是绝对路径 举例具体看一下输出: 复制代码 代码如下: print os.path.dirname(

  • 在Python程序中操作文件之flush()方法的使用教程

    flush()方法刷新内部缓冲区,像标准输入输出的fflush.这类似文件的对象,无操作. Python关闭时自动刷新文件.但是可能要关闭任何文件之前刷新数据. 语法 以下是flush()方法的语法: fileObject.flush(); 参数 NA 返回值 此方法不返回任何值. 例子 下面的例子显示了flush()方法的使用. #!/usr/bin/python # Open a file fo = open("foo.txt", "wb") print &qu

  • 在Python中操作文件之truncate()方法的使用教程

    truncate()方法截断该文件的大小.如果可选的尺寸参数存在,该文件被截断(最多)的大小. 大小默认为当前位置.当前文件位置不改变.注意,如果一个指定的大小超过了文件的当前大小,其结果是依赖于平台. 注意:此方法不会在当文件工作在只读模式打开. 语法 以下是truncate()方法的语法: fileObject.truncate( [ size ]) 参数 size -- 如果可选参数存在,文件被截断(最多)的大小. 返回值 此方法不返回任何值. 例子 下面的例子显示 truncate()方

  • Python 3.6 读取并操作文件内容的实例

    所使用python环境为最新的3.6版本 Python中几种对文件的操作方法: 将A文件复制到B文件中去(保持原来格式) 读取文件中的内容,返回List列表 (加载本地词典库) 读取文件,返回文件内容 #!/usr/bin/env python # encoding: utf-8 """ @author: wugang @contact: 752820344@qq.com @software: PyCharm @file: toolkits_file.py @time: 20

  • Python使用os模块和fileinput模块来操作文件目录

    os模块 在python编程中,我们会经常使用到文件和目录,这些操作python提供一个os模块,里面有很多操作文件和目录的函数. 下面介绍os的常用功能 1.获取当前路径 >>> os.getcwd() '/root/python' 2.获取目录中的内容 >>> os.listdir(os.getcwd()) ['deco.py', '6.py', 'inputfile.py', 'uniFile.py', 'oddnogen.py', 'ospathex.py',

  • Python中操作文件之write()方法的使用教程

    write()方法把字符串str写入文件.没有返回值.由于缓冲,字符串可能不实际显示文件,直到flush()或close()方法被调用. 语法 以下是write()方法的语法: fileObject.write( str ) 参数 str -- 这是要被写入的文件中的字符串. 返回值 此方法不返回任何值. 例子 下面的例子显示write()方法的使用. #!/usr/bin/python # Open a file in write mode fo = open("foo.txt",

  • 在Python中操作文件之seek()方法的使用教程

    seek()方法在偏移设定该文件的当前位置.参数是可选的,默认为0,这意味着绝对的文件定位,它的值如果是1,这意味着寻求相对于当前位置,2表示相对于文件的末尾. 没有返回值.需要注意的是,如果该文件被打开或者使用'a'或'A+'追加,任何seek()操作将在下次写撤消. 如果该文件只打开使用"a"的追加模式写,这种方法本质上是一个空操作,但读使能(模式'a+'),它仍然在追加模式打开的文件非常有用. 如果该文件在文本模式下使用"t",只有tell()返回的偏移开都是

  • 在Python中使用next()方法操作文件的教程

    next()方法当一个文件被用作迭代器,典型例子是在一个循环中被使用,next()方法被反复调用.此方法返回下一个输入行,或引发StopIteration异常EOF时被命中. 与其它文件的方法,如ReadLine()相结合next()方法工作不正常.然而,usingseek()将文件重新定位到一个绝对位置将刷新预读缓冲器. 语法 以下是next()方法的语法: fileObject.next(); 参数 NA 返回值 此方法返回下一个输入行. 例子 下面的示例演示next()方法的使用. #!/

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

    前言 文件和目录操作是很常见的功能,这里做个简单的总结,包括注意事项和实际的实现代码,基本日常开发都够用了 目录操作 判断目录或是文件是否存在 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] 这个方法既简

  • 一篇文章搞懂Python Unittest测试方法的执行顺序

    目录 Unittest 回到主题 源码初窥 回到问题的本质 1. 以字典序的方式编写test方法 2. 回归本质,从根本解决问题 总结 Unittest unittest大家应该都不陌生.它作为一款博主在5-6年前最常用的单元测试框架,现在正被pytest,nose慢慢蚕食. 渐渐地,看到大家更多的讨论的内容从unittest+HTMLTestRunner变为pytest+allure2等后起之秀. 不禁感慨,终究是自己落伍了,跟不上时代的大潮了. 回到主题 感慨完了,回到正文.虽然unitte

  • 一篇文章搞定JavaScript类型转换(面试常见)

    为啥要说这个东西?一道面试题就给我去说它的动机. 题如下: var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); } 运行结果是true!!! 其实啥类型转换啊,操作符优先级啊,这些东西都是最最基本的.犀牛书上有详细的介绍.但我很少去翻犀牛书的前5章... 比如说优先级那块儿,很多书都教育我们,"不用去背诵优先级顺序,不确定的话,加括号就行了."平常我们写代码时也确实这么做的

  • 一篇文章搞懂python的转义字符及用法

    什么是转义字符 转义字符是一个计算机专业词汇.在计算机当中,我们可以写出123 ,也可以写出字母abcd,但有些字符我们无法手动书写,比如我们需要对字符进行换行处理,但不能写出来换行符,当然我们也看不见换行符.像这种情况,我们需要在字符中使用特殊字符时,就需要用到转义字符,在python里用反斜杠\转义字符. 在交互式解释器中,输出的字符串用引号引起来,特殊字符用反斜杠\转义.虽然可能和输入看上去不太一样,但是两个字符串是相等的. 在python里,转义字符\可以转义很多字符,比如\n表示换行,

  • 一篇文章搞懂Python反斜杠的相关问题

    大家在开发Python的过程中,一定会遇到很多反斜杠的问题,很多人被反斜杠的数量搞得头大. 首先我们写一段非常简单的Python代码,它的作用是把一个字段先转换为JSON格式的字符串,然后把这个字符串再转换为JSON格式的字符串: import json info = {'name': 'kingname', 'address': '杭州', 'salary': 99999} info_json = json.dumps(info) # 第一次转换以后,打印出来 print(info_json)

  • 一篇文章搞懂python混乱的切换操作与优雅的推导式

    前言 因为工作中不怎么使用python,所以对python的了解不够,只是在使用的时候才去学,在之前的几个例子中几乎没使用什么python的特有语法,本着完成任务优先的原则也没有深入,但是在阅读别人的代码的时候发现有些特有语法不是很熟悉,搞不清代码的真正意思,今天就搞清楚切片和推导式的使用,OK.我们开始吧 记忆点:正向的时候第一个是0,负向的时候第一个是-1,可以把列表当做一个换,正向的是1 ,负向的 是-1,0 是中间点 1.混乱的切片操作 一个完整的切片表达式包含两个":",用于

  • 一篇文章搞懂Python的类与对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 函数内部可嵌套函数,嵌套函数有更内一层的名称空间 类代码块,名称空间为类自身 类中可定义函数,类中的函数有自己的名称空间,在类的内层 类的实例对象有自己的名称空间,和类的名称空间独立 类可继承父类,可以链接至父类名称空间 正是这一层层隔离又连接的名称空间将变量.类.对象.函数等等都组织起来,使得它

  • 一篇文章搞定Struts2的类型转换

    前言 我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换!下面来看看详细的介绍吧. 一.类型转换的意义 所有的MVC框架,解决的都是表现层的解决方案,都需要收集用户请求参数,并把参数提供给控制器.但是,在Web应用中所有的请求参数都是字符串类型的,Java是强类型的语言,如何将字符串转换为Java类型,这是框架要解决的一个问题. 例如,一个注册页需要输入年龄.日期等.这时候就需要将日期.年龄字符串转换为相应类型. 二.Str

  • 一篇文章搞定数据库连接池

    目录 1.什么是数据库连接池 2.为什么需要连接池,好处是什么? 3.都有哪些连接池方案 4.连接池需要关注的参数 5.怎么创建连接池,show me the code 5.1 pom.xml 加入依赖 5.2 配置文件 5.3 调用 6.总结 1.什么是数据库连接池 就是一个容器持有多个数据库连接,当程序需要操作数据库的时候直接从池中取出连接,使用完之后再还回去,和线程池一个道理. 2.为什么需要连接池,好处是什么? 1.节省资源,如果每次访问数据库都创建新的连接,创建和销毁都浪费系统资源 2

  • 一篇文章搞定echarts地图轮播高亮

    目录 前言 toDoList just do it 准备一个地图 保存实例备用 设置定时器轮播 加入鼠标事件 总结 前言 这两天忙着做公司的超级数据大屏,实在挤不出时间连续更文. 但是更文活动都坚持这么久了也不想停止更新,那我就分享一下在工作中经常用到的echarts地图轮播高亮吧. 技术栈用的是vue2.x 相信效果大家已经清楚了那我们就开干吧. toDoList 简单的准备一个地图 保存实例备用 设置定时器 设置鼠标移入移出事件 just do it 准备一个地图 首先准备一个简简单单的地图

随机推荐