1、Python对文件和文件夹的操作: 含os, shutil和glob模块

打开文件

如果你要对一个文件进行读或写,你必需先用Python内置的open函数打开它,创建一个文件对象File Object,你同时必需指定文件打开模式(读,写,还是读和写)。值得注意的是当你打开非文本文件如图片或PDF时侯,必需用rb或wb模式。b代表二进制文件。例子如下。

# 以读模式打开文本文件
txtFileObj = open('some.txt', 'r')

# 以读模式打开非文本文件
pdfFileObj = open('some.pdf', 'rb')

常用文件打开模式如下:

模式描述
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

File对象的属性

一个文件被打开后,你就有了一个file对象,这时你可以通过以下属性得到有关该文件的各种信息,比如名字,访问模式。

属性描述
file.closed返回true如果文件已被关闭,否则返回false。
file.mode返回被打开文件的访问模式。
file.name返回文件的名称。
file.softspace如果用print输出后,必须跟一个空格符,则返回false。否则返回true。

阅读文件

阅读文件,你可以用file对象自带的read方法。例子如下:

# 打开非文本文件
txtFileObj = open('some.txt', 'r')
print(txtFileObj.read())

# 打开非文本文件
pdfFileObj = open('original.pdf', 'rb')
pdfFileObj.read()

当你的文本文件有多行时,而你不想一次性打印出所有内容,你可以这么做。

# 以读模式打开非文本文件
txtFileObj = open('some.txt', 'r')
# 打印第5行
print(txtFileObj.read(5))
# 逐行打印
print(txtFileObj.readlines())
# 或者如下操作
for line in txtFileObj: 
    print(line)

写入文件

要将数据写入一个文件,你必需以写或读写的模式先创建一个文件对象,然后使用write方法写入。下面是两个例子。

# 以写模式创建文件对象,然后写入
txtFileObj = open('some.txt', 'r+')
txtFileObj.write("Hello, world")
txtFileObj.close()

# 以写模式打开非文本文件,然后写入
f = some_data
with open('some.pdf', 'wb+') as pdfFileObj:
    for chunk in f.chunks():
        pdfFileObj.write(chunk)

关闭文件与with声明

当你打开一个文件对象后,你一定要记住用f.close()关闭这个文件对象,这样才会释放系统资源。如果你老是忘记关闭一个文件,我们强烈建议使用python的with声明打开一个文件。这样在你完成文件读写操作后,python会自动关闭文件对象。例子如下:

# 以写模式创建文件对象,然后写入
with open('some.txt', 'r+') as txtFileObj:
    txtFileObj.write("Hello, world")

python的os模块, shutil模块和glob模块

python自带的open,read, write是非常基本的文件操作。对于复杂点的文件夹和文件操作,我们需要借助python的os模块,shutil模块和glob模块。这些模块都不需要额外的安装,只需要import即可。

os模块的常见功能

os模块自带的文件和文件夹操作方法都非常有用。

  • 得到当前工作目录的路径: os.getcwd()

  • 改变当前工作目录: os.chdir(path)

     

  • 返回指定目录下的所有文件和目录名:os.listdir(path)

  • 函数用来删除一个文件:os.remove(path)和os.unlink(path)

  • 检验给出的路径是否是一个文件:os.path.isfile(path)

  • 检验给出的路径是否是一个目录:os.path.isdir(path)

     

  • 判断是否是绝对路径:os.path.isabs()

  • 检查是否快捷方式os.path.islink (filename )

  • 检验给出的路径是否真地存在:os.path.exists(path)

  • 返回一个路径的目录名和文件名:os.path.split() eg os.path.split('/home/python/django.html') 结果:('/home/python', 'django.html')

  • 拼接工作路径: os.path.join(str1, str2, str3..)

  • 分离扩展名:os.path.splitext()

  • 获取路径名:os.path.dirname(path)

  • 获取文件名:os.path.basename()

  • 运行shell命令: os.system()

  • 读取和设置环境变量:os.getenv() 与os.putenv()

  • 给出当前平台使用的行终止符:os.linesep Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'

  • 指示你正在使用的平台:os.name 对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'

  • 重命名:os.rename(old, new)

  • 创建多级目录:os.makedirs(r“c:\python\test”)

  • 创建单个目录:os.mkdir(“test”)

  • 删除单个目录: os.rmdir(“test")

  • 删除多个目录:os.removedirs(r“c:\folder”)

  • 获取文件属性:os.stat()

  • 修改文件权限与时间戳:os.chmod()

  • 终止当前进程:os.exit()

  • 获取文件大小:os.path.getsize(filename)

值得注意的是windows和Linux采用了不同的路径分隔符(“/”和"\"。我最喜欢的方法是os.path.join方法,提高了我们代码可移植性。比如下面代码:

os.path.join("python", "django", "some.py")
  • 在windows下返回python\django\some.py
  • 在linux下返回python/django/some.py

另外请记住删除单个文件用os.remove()或os.unlink()。在Windows系统下删除一个正在使用的文件会出现错误。删除单个文件夹请用os.rmdir(), 但是该方法只能用于删除一个空的目录。 删除多个目录用os.removedirs(),如果子目录删除不成功(比如不为空),也会出现错误。

 

接下来我们再看几个利用os模块操作文件的实际案例,这些面试和实际工作中都需要了解的知识。

 

查找某个目录下的全部txt文件并删除。

假设我们在当前工作目录下有个叫tutorial的文件夹,我们要把里面的txt文件,删除,我们可以这么做:

 

>>> import os
>>> os.getcwd() # 获取当前工作目录
'C:\\Users\\MissEnka\\Python'
>>> os.listdir('tutorial') # 查看tutorial文件夹
['notes.txt', 'pdf docs', 'txtfiles']
>>> for filename in os.listdir('tutorial'):
    if filename.endswith('.txt'):
        os.remove(os.path.join('tutorial', filename))
        print("{} deleted.".format(filename))

notes.txt deleted.

上段代码有2点需要你注意的地方,你发现没有?

  • 我们只删除了tutorial文件下的notes.txt文件,并没有删除子文件夹txtfiles里的.txt文件。想要遍历一个文件夹,查找所有目录包括子目录的文件,我们需要用到下面会提到的os.walk()方法。

  • 我们用的os.remove(os.path.join("tutorial"), filename))而不是简单用os.remove(filename)来删除文件,这是因为notes.txt相对于当前工作目录的路径是/tutorial/notes.txt, 而不是notes.txt。

 使用os.walk()遍历一个文件夹子目录查找所有txt文件并删除

>>> for foldName, subfolders, filenames in os.walk('tutorial'):
    for filename in filenames:
      if filename.endswith('.txt'):
         os.remove(os.path.join(foldName, filename))
         print("{} deleted.".format(filename))

用os.walk()打印出某个文件夹下所有子目录和文件名称方法如下。来源: Automate the boring stuff with Python。

import os
folderName, subfolders, filenames in os.walk('directory'):
    print('The current folder is ' + folderName)

    for subfolder in subfolders:
        print('SUBFOLDER OF ' + folderName + ': ' + subfolder)
    for filename in filenames:
        print('FILE INSIDE ' + folderName + ': '+ filename)

    print('')

 

利用shutil模块复制和移动文件

shutil模块可以用来复制和移动一个文件。shutil.copy()用来复制文件,第一个参数是需要复制的文件,第二个参数可以是文件夹,也可以是个文件名。如果是文件夹,新文件将存储在新文件夹里,文件名不变。如果是文件名,则新文件直接以文件名命名。shutil.copyfile()与shutil.copy()类似,只不过2个参数都必需是文件名。

 

>> import shutil
>> import os
>> os.chdir('C:\\')
>> shutil.copy('C:\\spam.txt', 'C:\\delicious')
'C:\\delicious\\spam.txt'
>> shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt')
'C:\\delicious\\eggs2.txt'

shutil还常用来复制文件夹或移动文件,代码如下:

# 复制文件夹. olddir和newdir都只能是目录,且newdir必须不存在
shutil.copytree("老目录", "新目录")

# 移动文件(目录)
shutil.move("老位置", "新位置") 

 

利用glob模块快速查找当前文件夹文件

glob模块是最简单的python模块。它可以查找符合特定规则的文件路径名,并返回所有匹配的文件路径列表。类似正则表达式,glob支持三个匹配符:”*”, “?”, “[]”。”*”匹配0个或多个字符;”?”匹配单个字符;”[]”匹配指定范围内的字符.

>>> import os
>>> os.getcwd()
'C:\\Users\\MissEnka\\Python'
>>> import glob
>>> glob.glob('*.txt')
['LICENSE.txt', 'list.txt', 'NEWS.txt']
>>> glob.glob('tutorial/.txt')
[]
>>> glob.glob('tutorial/*.txt')
['tutorial\\new.txt']

glob一般只搜索当前工作目录或指定目录里的文件, 不能做文件夹遍历, 用时需注意.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值