1. OS模块文件操作

1.1 基本函数

Note: 在 Windows 上, 路径书写使用倒斜杠作为文件夹之间的分隔符。但在 OS X 和 Linux 上,使用正斜杠作为它们的路径分隔符。如果想要程序运行在所有操作系统上,在编写 Python 脚本时, 就必须处理这两种情况。

使用OS模块的path.join函数可以根据操作系统不同自动生成相应的路径,example:

  1. import os
  2. os.path.join('usr', 'bin', 'spam')
  3. >>> windows: 'usr\\bin\\spam'
  4. >>> linux: usr/bin/spam

OS模块还有其他有趣的函数,帮助你专注于操作,减少对操作系统差异的关注:

os模块function 含义
os.getcwd() 获取当前所在目录
os.chdir(‘path’) 切换到指定目录
os.makedirs(‘path’) 创建指定目录
os.listdir(path) 列出path路径下所有文件
os.unlink(path) 删除path文件
os.rmdir(path) 删除path文件夹,文件夹必须为空
os.path模块function 含义
os.path.abspath(path) 返回path的绝对路径
os.path.isabs(path) 判断path是否是绝对路径
os.path.relpath(path, start) 返回从 start 路径到 path 的相对路径的字符串
os.path.dirname(path) 返回path中路径名,去除文件名
os.path.basename(path) 返回path中的文件名
os.path.split() 返回一个元组,包含路径和文件名
os.path.sep 代表指定操作系统中路径分隔符
os.path.getsize(path) 返回文件大小
os.path.exists(path) path是否存在
os.path.isfile(path) path是否存在,且为文件
os.path.isdir(path) path 是否存在,且为目录

1.2 os.walk遍历文件夹

os.walk()函数被传入一个字符串值,即一个文件夹的路径。你可以在一个 for 循环语句中使用 os.walk()函数,遍历目录树, os.walk()在循环的每次迭代中,返回 3 个值:

  1. 当前文件夹名称的字符串。
  2. 当前文件夹中子文件夹的字符串的列表。
  3. 当前文件夹中文件的字符串的列表
  1. for dirname, subdir, filename in os.walk('.'):
  2. print('directory name: ' + dirname)
  3. print(subdir) >>>list
  4. print(filename) >>>list

2. 文件读写

在 Python 中, 读写文件有 3 个步骤:

  1. 调用 open()函数, 返回一个 File 对象。
  2. 调用 File 对象的 read()或 write()方法。
  3. 调用 File 对象的 close()方法,关闭该文件。

Example:

  1. # write to file
  2. file = open('./hello.txt', 'w')
  3. file.write('hello world\n')
  4. file.close()
  5. # append to file
  6. file = open('./hello.txt', 'a')
  7. file.write('hello python\n')
  8. file.close()
  9. # read from file
  10. file = open('./hello.txt', 'r')
  11. text = file.read()
  12. file.close()
  13. print(text)

3. shelve模块保存变量到文件

利用 shelve 模块, 你可以将 Python 程序中的变量保存到二进制的 shelf 文件中。这样, 程序就可以从硬盘中恢复变量的数据。shelve.open()会创建二进制的shelf文件,允许你像字典一样存取数据:

  1. import shelve
  2. shelf = shelve.open('data')
  3. cats = ['zophie', 'pooka', 'simon']
  4. shelf['cats'] = cats
  5. shelf.close()

保存之后,在windows上会生成mydata.bak、 mydata.dat 和 mydata.dir三个文件。在Linux和 OS X 上, 只会创建一个 mydata.db 文件。

读取文件时,和字典一样的操作:

  1. import shelve
  2. shelf = shelve.open('data')
  3. for cat in shelf['cats']:
  4. print(cat)

删除变量时,直接使用del shelf[key]即可。

4. shutil模块移动复制删除

shutil(或称为 shell 工具)模块中包含一些函数,让你在 Python 程序中复制、移动、改名和删除文件。

如下为常用的函数:

函数 含义
shutil.copy(source, destination) 将路径 source 处的文件复制到路径 destination 处的文件夹。返回被复制文件的路径
shutil.copytree(source, destination) 将路径 source 处的文件夹,包括它的所有文件和子文件夹,复制到路径 destination 处的文件夹。返回被复制文件的路径
shutil.move(source, destination) 路径 source 处的文件夹移动到路径 destination,并返回新位置的绝对路径的字符串。也可重命名
shutil.rmtree(path) 删除path文件夹和所有子文件夹

Note: shutil删除文件是彻底删除,如果需要移到回收站,可以使用第三方的库send2trash

5. zipfile解压缩文件

要读取 ZIP 文件的内容, 首先必须创建一个 ZipFile 对象。ZipFile 对象有一个 namelist()方法,返回 ZIP 文件中包含的所有文件和文件夹的字符串的列表。这些字符串可以传递给 ZipFile 对象的 getinfo()方法,返回一个关于特定文件的 ZipInfo 对象。

ZipInfo 对象有自己的属性,诸如表示字节数的 file_size 和 compress_size,它们分别表示原来文件大小和压缩后文件大小。

ZipFile 对象的 extractall(path)方法从 ZIP 文件中解压缩所有文件和文件夹, 放到path中。
ZipFile 对象的 extract(filename,path)方法从 ZIP 文件中解压缩单个文件。

Example:

  1. import zipfile
  2. zip = zipfile.ZipFile('d:\\Desktop\Desktop.zip')
  3. # 打印所有文件
  4. print(zip.namelist())
  5. # 获取某个文件对应的ZipInfo对象
  6. info = zip.getinfo('Cas T&D.xlsx')
  7. # 打印文件大小
  8. print(info.file_size)
  9. # 解压文件
  10. zip.extractall('d:\\Desktop')
  11. zip.close()

要创建你自己的压缩 ZIP 文件, 必须以“写模式”打开 ZipFile 对象,即传入’w’ 作为第二个参数。write()方法的第一个参数是一个字符串, 代表要添加的文件名。第二个参数是“压缩类型”参数(可以默认),它告诉计算机使用怎样的算法来压缩文件。
如果
只是希望将文件添加到原有的 ZIP 文件中, 就要向 zipfile.ZipFile()传入’a’作为第二个参数,以添加模式打开 ZIP 文件

  1. #创建一个压缩文件
  2. zip = zipfile.ZipFile('myzip.zip', 'w')
  3. os.chdir('d:\\Desktop\CDE')
  4. for item in os.listdir('.'):
  5. zip.write(item)
  6. zip.close()