文件有两个关键的熟悉——文件名、路径
有几个需要注意的就是:
1.虽然文件夹名称和文件名在Windows 和OS X 上是不区分大小写的,但在Linux 上是区分大小写的
2.倒斜杠‘\’和正斜杠‘/’ 要能够分清楚(windows使用前者 OS X 以及Linux使用后者)
要使用就需要导入OS模块
import os
1.os.path.join()——解决跨系统斜杠问题
有一个函数,很好的解决了系统环境的差异问题(其实就是斜杠的不同问题)
os.path.join()函数 将单个文件和路径上的文件夹名称的字符串传递给它,os.path.join()就会返回一个文件路径的字符串,包含正的路径分隔符。
先来看一个例子:
os.path.join('usr', 'bin', 'spam')
在windows返回'usr\\bin\\spam'(请注意,倒斜杠有两个,因为每个倒斜杠需要由另一个倒斜杠字符来转义)。如果我在OS X 或Linux 上调用这个函数,该字符串就会是'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
2.当前工作目录
os.getcwd()——获取当前工作目录
os.chdir()——改变当前工作目录
3.绝对路径以及相对路径
有两种方法指定一个文件路径。
• “绝对路径”,总是从根文件夹开始。
• “相对路径”,它相对于程序的当前工作目录。
还有点(.)和点点(..)文件夹。它们不是真正的文件夹,而是可以在路径中使用的特殊名称。单个的句点(“点”)用作文件夹目名称时,是“这个目录”的缩写。两个句点(“点点”)意思是父文件夹。
在path模块中有几个函数是用来专门处理绝对路径与相对路径的
• 调用os.path.abspath(path)将返回参数的绝对路径的字符串。这是将相对路径转换为绝对路径的简便方法。
• 调用os.path.isabs(path),如果参数是一个绝对路径,就返回True,如果参数是一个相对路径,就返回False。
• 调用os.path.relpath(path, start)将返回从start 路径到path 的相对路径的字符串。如果没有提供start,就使用当前工作目录作为开始路径。
4.创建文件夹
os.makedirs() 这个函数会创建所有必要的中间文件夹,目的是确保完整路径名存在。
5.os.path 模块
os.path 模块包含了许多与文件名和文件路径相关的有用函数。os.path 模块的完整文档在Python网站上:http://docs.python.org/3/library/os.path.html。
之前也有说到过几个函数,现在再来补充一下几个经常用到的函数
os.path.dirname(path)将返回一个字符串,它包含path 参数中最后一个斜杠之前的所有内容。——目录名称
os.path.basename(path)将返回一个字符串,它包含path 参数中最后一个斜杠之后的所有内容。——基本名称
同时需要一个路径的目录名称和基本名称,就可以调用os.path.split(),获得这两个字符串的元组,——两者的元组
如果我们需要将每个文件夹分割出来,也就是返回每个文件夹的字符串列表
大致意思就是 返回的数据大致是:['C:', 'Windows', 'System32', 'calc.exe']
如果需要这样,请使用split()字符串方法,并根据os.path.sep 中的字符串进行分割。回忆一下,根据程序运行的计算机,os.path.sep 变量设置为正确的文件夹分割斜杠。
(其实就是字符串的分割 os.path.sep 代表的就是分隔符——斜杠)
5.查看文件大小
os.path.getsize(path)将返回path 参数中文件的字节数。
os.listdir(path)将返回文件名字符串的列表,包含path 参数中的每个文件(请注意,这个函数在os 模块中,而不是os.path)。
6.检查路径有效性
• 如果path 参数所指的文件或文件夹存在,调用os.path.exists(path)将返回True,否则返回False。——是否存在
• 如果path 参数存在,并且是一个文件,调用os.path.isfile(path)将返回True,否则返回False。——文件
• 如果path 参数存在,并且是一个文件夹,调用os.path.isdir(path)将返回True,否则返回False。——文件夹
关于文件目录以及文件名的 就先说到这
现在开始来看文件读写的部分了,说到文件 就需要分清处理什么文件了
“纯文本文件”只包含基本文本字符,不包含字体、大小和颜色信息。带有.txt 扩展名的文本文件,以及带有.py 扩展名的Python 脚本文件,都是纯文本文件的例子。它们可以被Windows 的Notepad 或OS X 的TextEdit应用打开。你的程序可以轻易地读取纯文本文件的内容,将它们作为普通的字符串值。
“二进制文件”是所有其他文件类型,诸如字处理文档、PDF、图像、电子表格和可执行程序。如果用Notepad 或TextEdit 打开一个二进制文件,它看起来就像乱码。
我们处理的就是纯文本文件,python在处理(读写)文件的时候,一般就是三个步骤:
1.调用open()函数,返回一个File 对象。
2.调用File 对象的read()或write()方法。
3.调用File 对象的close()方法,关闭该文件。
打开文件 python的默认模式是“读模式”,如果你不希望依赖于Python 的默认值,也可以明确指明该模式,向open()传入字符串'r',作为第二个参数
‘r’默认模式 只能读取 ,不能修改文件内容
‘w’写模式 覆盖原有内容(文件不存在的时候会新建)
‘a’添加模式 在已有文件的末尾添加文本(文件不存在的时候会新建)
关于读文件,当然不单单一个read()函数
readlines()方法,从该文件取得一个字符串的列表。列表中的每个字符串就是文本中的每一行。
关于写文件 需要注意一点:write()方法不会像print()函数那样,在字符串的末尾自动添加换行字符。必须自己添加该字符。
下面来说说一个新的模块——shelve
可以将Python 程序中的变量保存到二进制的shelf 文件中。这样,程序就可以从硬盘中恢复变量的数据。shelve 模块让你在程序中添加“保存”和“打开”功能。例如,如果运行一个程序,并输入了一些配置设置,就可以将这些设置保存到一个shelf 文件,然后让程序下一次运行时加载它们。
我们就来看下是怎么使用的
import shelve
shelfFile = shelve.open('mydata')
cats = ['Zophie', 'Pooka', 'Simon']
shelfFile['cats'] = cats
shelfFile.close()
这里,我们的shelf 值保存在shelfFile中。我们创建了一个列表cats,并写下shelfFile['cats'] =cats,将该列表保存在shelfFile 中,作为键'cats'关联的值(就像在字典中一样)。
在Windows 上运行前面的代码,你会看到在当前工作目录下有3 个新文件:mydata.bak、mydata.dat 和mydata.dir。
在OS X 上,只会创建一个mydata.db 文件。
这些二进制文件包含了存储在shelf 中的数据。这些二进制文件的格式并不重要,你只需要知道shelve 模块做了什么,而不必知道它是怎么做的。该模块让你不用操心如何将程序的数据保存到文件中。
你的程序稍后可以使用shelve 模块,重新打开这些文件并取出数据。shelf 值不必用读模式或写模式打开,因为它们在打开后,既能读又能写。
shelfFile = shelve.open('mydata')
>>> type(shelfFile)
>>> shelfFile['cats']
['Zophie', 'Pooka', 'Simon']
>>> shelfFile.close()
像字典一样,shelf 值有keys()和values()方法,返回shelf 中键和值的类似列表的值。因为这些方法返回类似列表的值,而不是真正的列表,所以应该将它们传递给list()函数,取得列表的形式。
>>> shelfFile = shelve.open('mydata')
>>> list(shelfFile.keys())
['cats']
>>> list(shelfFile.values())
[['Zophie', 'Pooka', 'Simon']]
>>> shelfFile.close()
还有一种方式可以用来保存变量
pprint.pformat()函数将返回文本字符串,但不是打印它。这个字符串不仅是易于阅读的格式,同时也是语法上正确的Python 代码。假定你有一个字典,保存在一个变量中,你希望保存这个变量和它的内容,以便将来使用。
pprint.pformat()函数将提供一个字符串,你可以将它写入.py 文件。该文件将成为你自己的模块,如果你需要使用存储在其中的变量,就可以导入它。
例如,在交互式环境中输入以下代码:
>>> 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()
这里,我们导入了pprint,以便能使用pprint.pformat()。我们有一个字典的列表,保存在变量cats 中。为了让cats 中的列表在关闭交互式环境后仍然可用,我们利用pprint.pformat(),将它返回为一个字符串。当我们有了cats 中数据的字符串形式,就很容易将该字符串写入一个文件,我们将它命名为myCats.py。
import 语句导入的模块本身就是Python 脚本。如果来自pprint.pformat()的字符串保存为一个.py 文件,该文件就是一个可以导入的模块,像其他模块一样。由于Python 脚本本身也是带有.py 文件扩展名的文本文件,所以你的Python 程序甚至可以生成其他Python 程序。然后可以将这些文件导入到脚本中。