python——读写文件

文件有两个关键的熟悉——文件名、路径

有几个需要注意的就是:

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.bakmydata.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 程序。然后可以将这些文件导入到脚本中。

你可能感兴趣的:(python)