天天看点

《Python编程快速上手——让繁琐工作自动化》第八章第8章 读写文件

第8章 读写文件

8.1 文件与文件路径

虽然文件夹名称和文件名在Windows和OS X上是不区分大小写的,但在Linux上是区分大小写的。

8.1.1 Windows上的倒斜杠以及OS X和Linux上的正斜杠

如果将单个文件和路径上的文件夹名称的字符串传递给它,os.path.join()就会返回一个文件路径的字符串,包含正确的路径分隔符。

>>> import os
>>> os.path.join('usr', 'bin', 'spam')
'usr\\bin\\spam'
           

如果需要创建文件名称的字符串,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
           

8.1.2 当前工作目录

每个运行在计算机上的程序,都有一个“当前工作目录”,或cwd。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。利用os.getcwd()函数,可以取得当前工作路径的字符串,并可以利用os.chdir()改变它。

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

这里,当前工作目录设置为C:\Python34,所以文件名project.docx指向C:\Python34\project.docx。如果我们将当前工作目录改为C:\Windows,文件就被解释为C:\Windows\project.docx。

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

8.1.3 绝对路径与相对路径

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

程序可以用os.makedirs()函数创建新文件夹(目录)。

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

这不仅将创建C:\delicious文件夹,也会在C:\delicious下创建walnut文件夹,并在C:\delicious\walnut中创建waffles文件夹。也就是说,os.makedirs()将创建所有必要的中间文件夹,目的是确保完整路径名存在。

8.1.5 os.path模块

os.path模块的完整文档在Python网站上:http://docs.python.org/3/library/os.path.html。

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

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

  • 调用os.path.abspath(path)将返回参数的绝对路径的字符串。这是将相对路径转换为绝对路径的简便方法。
  • 调用os.path.isabs(path),如果参数是一个绝对路径,就返回True,如果参数是一个相对路径,就返回False。
  • 调用os.path.relpath(path, start)将返回从start路径到path的相对路径的字符串。如果没有提供start,就使用当前工作目录作为开始路径。
>>> os.path.abspath('.')
'C:\\Python34'
>>> os.path.abspath('.\\Scripts')
'C:\\Python34\\Scripts'
>>> os.path.isabs('.')
False
>>> os.path.isabs(os.path.abspath('.'))
True
           

调用os.path.dirname(path)将返回一个字符串,它包含path参数中最后一个斜杠之前的所有内容。调用os.path.basename(path)将返回一个字符串,它包含path 参数中最后一个斜杠之后的所有内容。

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

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

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

调用os.path.getsize(path)将返回path参数中文件的字节数。

调用os.listdir(path)将返回文件名字符串的列表,包含path参数中的每个文件(请注意,这个函数在os模块中,而不是os.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
           

8.1.8 检查路径有效性

os.path模块提供了一些函数,用于检测给定的路径是否存在,以及它是文件还是文件夹。

  • 如果path参数所指的文件或文件夹存在,调用os.path.exists(path)将返回True,否则返回False。
  • 如果path参数存在,并且是一个文件,调用os.path.isfile(path)将返回True,否则返回False。
  • 如果path参数存在,并且是一个文件夹,调用os.path.isdir(path)将返回True,否则返回False。

8.2 文件读写过程

接下来几节介绍的函数适用于纯文本文件。“纯文本文件”只包含基本文本字符,不包含字体、大小和颜色信息。带有.txt扩展名的文本文件,以及带有.py扩展名的Python脚本文件,都是纯文本文件的例子。它们可以被Windows的Notepad或OS X的TextEdit应用打开。你的程序可以轻易地读取纯文本文件的内容,将它们作为普通的字符串值。

“二进制文件”是所有其他文件类型,诸如字处理文档、PDF、图像、电子表格和可执行程序。如果用Notepad或TextEdit打开一个二进制文件,它看起来就像乱码。

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

1.调用open()函数,返回一个File对象。

2.调用File对象的read()或write()方法。

3.调用File对象的close()方法,关闭该文件。

8.2.1 用open()函数打开文件

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

命令都将以读取纯文本文件的模式打开文件,或简称为“读模式”。当文件以读模式打开时,Python只让你从文件中读取数据,你不能以任何方式写入或修改它。在Python中打开文件时,读模式是默认的模式。但如果你不希望依赖于Python的默认值,也可以明确指明该模式,向open()传入字符串'r',作为第二个参数。

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

8.2.2 读取文件内容

既然有了一个File对象,就可以开始从它读取内容。如果你希望将整个文件的内容读取为一个字符串值,就使用File对象的read()方法。

或者,可以使用readlines()方法,从该文件取得一个字符串的列表。列表中的每个字符串就是文本中的每一行。

8.2.3 写入文件

写模式将覆写原有的文件,从头开始,就像你用一个新值覆写一个变量的值。将'w'作为第二个参数传递给open(),以写模式打开该文件。不同的是,添加模式将在已有文件的末尾添加文本。你可以认为这类似向一个变量中的列表添加内容,而不是完全覆写该变量。将'a'作为第二个参数传递给open(),以添加模式打开该文件。

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

8.3 用shelve模块保存变量

利用shelve模块,你可以将Python程序中的变量保存到二进制的shelf文件中。这样,程序就可以从硬盘中恢复变量的数据。shelve模块让你在程序中添加“保存”和“打开”功能。例如,如果运行一个程序,并输入了一些配置设置,就可以将这些设置保存到一个shelf文件,然后让程序下一次运行时加载它们。

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

要利用shelve模块读写数据,首先要导入它。调用函数shelve.open()并传入一个文件名,然后将返回的值保存在一个变量中。可以对这个变量的shelf值进行修改,就像它是一个字典一样。当你完成时,在这个值上调用close()。这里,我们的shelf值保存在shelfFile中。我们创建了一个列表cats,并写下shelfFile['cats'] =cats,将该列表保存在shelfFile中,作为键'cats'关联的值(就像在字典中一样)。然后我们在shelfFile上调用close()。

你的程序稍后可以使用shelve模块,重新打开这些文件并取出数据。shelf值不必用读模式或写模式打开,因为它们在打开后,既能读又能写。

就像字典一样,shelf值有keys()和values()方法,返回shelf中键和值的类似列表的值。因为这些方法返回类似列表的值,而不是真正的列表,所以应该将它们传递给list()函数,取得列表的形式。

>>> shelfFile = shelve.open('mydata')
>>> list(shelfFile.keys())
['cats']
>>> list(shelfFile.values())
[['Zophie', 'Pooka', 'Simon']]
>>> shelfFile.close()
           

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

回忆一下5.2节“漂亮打印”中,pprint.pprint()函数将列表或字典中的内容“漂亮打印”到屏幕,而pprint.pformat()函数将返回同样的文本字符串,但不是打印它。这个字符串不仅是易于阅读的格式,同时也是语法上正确的Python代码。假定你有一个字典,保存在一个变量中,你希望保存这个变量和它的内容,以便将来使用。pprint.pformat()函数将提供一个字符串,你可以将它写入.py文件。该文件将成为你自己的模块,如果你需要使用存储在其中的变量,就可以导入它。

8.5-8.6项目