Python编程快速上手—2.自动化任务之读写文件

目录

    • 2. 读写文件
      • 2.1 文件与文件路径
        • 2.1.1 当前工作目录
        • 2.1.2 绝对路径与相对路径
        • 2.1.3 用os.makedirs()创建新文件夹
        • 2.1.4 os.path 模块
        • 2.1.5 处理绝对路径和相对路径
        • 2.1.6 查看文件大小和文件夹内容
        • 2.1.7 检查路径有效性
      • 2.2 文件读写过程
        • 2.2.1 用 open()函数打开文件
        • 2.2.2 读取文件内容
        • 2.2.3 写入文件
      • 2.3 用 shelve 模块保存变量
      • 2.4 用 pprint.pformat()函数保存变量

2. 读写文件

2.1 文件与文件路径

在 Windows 上,路径书写使用倒斜杠作为文件夹之间的分隔符。

在 OS X 和Linux 上,使用正斜杠作为它们的路径分隔符。

如果需要创建文件名称的字符串,os.path.join()函数就很有用。这些字符串将传
递给几个文件相关的函数。

>>> myFiles = ['accounts.txt', 'details.csv', 'invite.docx']
>>> for filename in myFiles:
print(os.path.join('C:\\Users\\asweigart', filename))
C:\Users\asweigart\accounts.txt
C:\Users\asweigart\details.csv
C:\Users\asweigart\invite.docx

2.1.1 当前工作目录

每个运行在计算机上的程序,都有一个“当前工作目录”,或 cwd。

利用 os.getcwd()函数,可以取得当前工作路径的字符串,并可以利用 os.chdir()改变它。

>>> import os
>>> os.getcwd()
'C:\\Python34'
>>> os.chdir('C:\\Windows\\System32')
>>> os.getcwd()
'C:\\Windows\\System32'

如果要更改的当前工作目录不存在,Python 就会显示一个错误。

2.1.2 绝对路径与相对路径

有两种方法指定一个文件路径。

  • “绝对路径”,总是从根文件夹开始。
  • “相对路径”,它相对于程序的当前工作目录。

单个的句点(“点”)用作文件夹目名称时,是“这个目录”的缩写。两个句点(“点点”)意思是父文件夹。

相对路径开始处的.\是可选的。例如,.\spam.txt 和 spam.txt 指的是同一个文件。

2.1.3 用os.makedirs()创建新文件夹

>>> import os
>>> os.makedirs('C:\\delicious\\walnut\\waffles')

这不仅将创建 C:\delicious 文件夹,也会在 C:\delicious 下创建 walnut 文件夹,
并在 C:\delicious\walnut 中创建 waffles 文件夹。目的是确保完整路径名存在。

2.1.4 os.path 模块

os.path 模块包含了许多与文件名和文件路径相关的有用函数。

例如:os.path.join()来构建所有操作系统上都有效的路径。

2.1.5 处理绝对路径和相对路径

os.path 模块提供了一些函数,返回一个相对路径的绝对路径,以及检查给定的
路径是否为绝对路径。

  • os.path.isabs(path) 是绝对路径,就返回 True
  • os.path.abspath(path) 将相对路径转换为绝对路径
  • os.path.relpath(path, start) 返回从 start 路径到 path 的相对路径的字符串

基本名称跟在路径中最后一个斜杠后,它和文件名一样,目录名称是最后一个斜杠之前的所有内容

  • os.path.dirname(path) 返回目录名称
  • os.path.basename(path) 返回基本名称
>>> path = 'C:\\Windows\\System32\\calc.exe'
>>> os.path.basename(path)
'calc.exe'
>>> os.path.dirname(path)
'C:\\Windows\\System32'

如果同时需要一个路径的目录名称和基本名称,就可以调用 os.path.split(),获
得这两个字符串的元组

>>> calcFilePath = 'C:\\Windows\\System32\\calc.exe'
>>> os.path.split(calcFilePath)
('C:\\Windows\\System32', 'calc.exe')

2.1.6 查看文件大小和文件夹内容

os.path 模块提供了一些函数,用于查看文件的字节数以及给定文件夹中的文件和子文件夹。

  • 调用 os.path.getsize(path)将返回 path 参数中文件的字节数。
  • 调用 os.listdir(path)将返回文件名字符串的列表,包含 path 参数中的每个文件

如果想知道这个目录下所有文件的总字节数,就可以同时使用 os.path.getsize()和 os.listdir()。

>>> totalSize = 0
>>> for filename in os.listdir('C:\\Windows\\System32'):
totalSize = totalSize + os.path.getsize(os.path.join('C:\\Windows\\System32', filename))
>>> print(totalSize)
1117846456

2.1.7 检查路径有效性

  • os.path.exists(path) path参数所指的文件或文件夹存在,将返回 True
  • os.path.isfile(path) path 参数存在,并且是一个文件,将返回 True
  • os.path.isdir(path) path 参数存在,并且是一个文件夹,将返回 True

2.2 文件读写过程

  • “纯文本文件”只包含基本文本字符,不包含字体、大小和颜色信息。带有 .txt扩展名的文本文件以及带有.py 扩展名的Python脚本文件,都是纯文本文件的例子。
  • “二进制文件”是所有其他文件类型,诸如字处理文档、PDF、图像、电子表格
    和可执行程序。

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

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

2.2.1 用 open()函数打开文件

open(path)函数返回一个 File 对象。

path既可以是绝对路径,也可以是相对路径。

>>> helloFile = open('C:\\Users\\your_home_folder\\hello.txt')

读模式是默认的模式。

File 对象代表计算机中的一个文件,它只是Python中另一种类型的值,就像你已熟悉的列表和字典。

2.2.2 读取文件内容

有了一个 File 对象,就可以开始从它读取内容。

  • read()方法将文件的内容看成是单个大字符串
  • readlines()方法从文件取得一个字符串的列表。列表中的每个字符串就是文本中的每一行。

与单个大字符串相比,字符串的列表通常更容易处理。

2.2.3 写入文件

需要以“写入纯文本模式”或“添加纯文本模式”打开该文件,或简称为“写模式”和“添加模式”。

write():将字符串写入文件,并返回写入的字符个数,包括换行符。然后用close()关闭该文件。

  • 写模式:(将’w’作为第二个参数传递给 open())将覆写原有的文件,从头开始
  • 添加模式:(将’a’作为第二个参数传递给 open())将在已有文件的末尾添加文本。

如果传递给 open()的文件名不存在,写模式和添加模式都会创建一个新的空文
件。在读取或写入文件后,调用 close()方法,然后才能再次打开该文件。

2.3 用 shelve 模块保存变量

将 Python 程序中的变量保存到二进制的 shelf 文件中

import shelve


shelfFile = shelve.open('mydata')
cats = ['Zophie', 'Pooka', 'Simon']
shelfFile['cats'] = cats
shelfFile.close()
shelfFile = shelve.open('mydata')
print(shelfFile['cats'])
shelfFile.close()

shelf 值不必用读模式或写模式打开,因为它们在打开后,既能读又能写。

就像字典一样,shelf值有keys()和values()方法,返回shelf中键和值的类似列表的值。

所以应该将它们传递给 list()函数,取得列表的形式。

创建文件时,如果你需要在 Notepad 或 TextEdit 这样的文本编辑器中读取它们,
纯文本就非常有用。但是,如果想要保存 Python 程序中的数据,那就使用 shelve 模块。

2.4 用 pprint.pformat()函数保存变量

假定你有一个字典,保存在一个变量中,你希望保存这个变量和它的内容,以便将来使用。pprint.pformat()函数将提供一个字符串,你可以将它写入.py文件。该文件将成为你自己的模块,如果你需要使用存储在其中的变量,就可以导入它。

创建自定义数据模块myCats

>>> import pprint
>>> cats = [{'name': 'Zophie', 'desc': 'chubby'}, {'name': 'Pooka', 'desc': 'fluffy'}]
>>> pprint.pformat(cats)
"[{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}]"
>>> fileObj = open('myCats.py', 'w')
>>> fileObj.write('cats = ' + pprint.pformat(cats) + '\n')
83
>>> fileObj.close()

使用自定义模块myCats

>>> import myCats
>>> myCats.cats
[{'name': 'Zophie', 'desc': 'chubby'}, {'name': 'Pooka', 'desc': 'fluffy'}]
>>> myCats.cats[0]
{'name': 'Zophie', 'desc': 'chubby'}
>>> myCats.cats[0]['name']
'Zophie'

只有基本数据类型,诸如整型、浮点型、字符串、列表和字典,可以作为简单文本写入一个文件。例如,File 对象就不能够编码为文本。

你可能感兴趣的:(Python)