@zhangyu756897669
2017-09-14T15:45:00.000000Z
字数 6642
阅读 861
python官方文档
一旦你有办法处理文件路径,你可以开始收集关于特定文件和文件夹的信息。 os.path模块提供用于查找文件大小(以字节为单位)和给定文件夹中的文件和文件夹的功能。
import os
os.path.getsize('D:\必应词典\BingDict.exe')
923136
os.listdir('D:\音乐')
['autorun.inf',
'BaiduNetdisk_5.6.1.exe',
'cn_office_professional_plus_2016_x86_x64_dvd.zip',
'office',
'setup.exe']
可以看到,我的电脑上的BingDict.exe程序大小为923136字节,而且我有很多文件在os.listdir('D:\音乐')。如果我想找到这个目录中所有文件的总大小,我可以一起使用os.path.getsize()和os.listdir()。
totalSize = 0
for filename in os.listdir('D:\音乐'):
totalSize = totalSize + os.path.getsize(os.path.join('D:\音乐', filename))
print(totalSize)
2589318131
当我循环在'D:\音乐'
文件夹中的每个文件名时,totalSize变量增加每个文件的大小。注意当我调用os.path.getsize()时,我使用os.path.join()来加载文件夹名称与当前的文件名。 os.path.getsize()返回的整数被添加到totalSize的值。循环遍历所有文件后,打印totalSize以查看'D:\音乐'
文件夹的总大小。
如果您提供不存在的路径,许多Python函数将会出现错误。 os.path模块提供了检查给定路径是否存在以及它是文件还是文件夹的功能。
* 调用os.path.exists(path)将返回True,如果参数中引用的文件或文件夹存在,并且如果不存在则返回False。
* 如果路径参数存在且调用os.path.isfile(path)将返回True,并且是一个文件,否则返回False。
* 如果路径参数存在且调用os.path.isdir(path)将返回True,并且是一个文件夹,否则返回False。
os.path.exists('C:\\Windows')
True
os.path.exists('C:\\some_made_up_folder')
False
os.path.isdir('C:\\Windows\\System32')
True
os.path.isfile('C:\\Windows\\System32')
False
os.path.isdir('D:\必应词典\BingDict.exe')
False
os.path.isfile('D:\必应词典\BingDict.exe')
True
os.path.exists('D:\\')
True
看来我的驱动器是正常运行的
由于每个不同类型的二进制文件必须以自己的方式处理,所以本书不会直接读取和写入原始的二进制文件。幸运的是,许多模块使二进制文件变得更加容易 - 您将在本章后面探索其中一个,即搁置模块。
在Python中读取或写入文件有三个步骤。
要使用open()函数打开文件,可以传递一个字符串路径,指示要打开的文件;它可以是绝对路径或相对路径。 open()函数返回一个File对象。
尝试通过使用记事本或TextEdit创建一个名为hello.txt的文本文件。类型Hello world!作为此文本文件的内容并将其保存在您的用户主文件夹中。然后,运行程序:
helloFile = open('D:\zhangyu.txt')
这个命令都将以简单阅读模式打开文件。当以读取模式打开文件时,Python只允许从文件读取数据;你不能以任何方式写或修改它。读取模式是您在Python中打开的文件的默认模式。但是,如果您不想依赖Python的默认值,则可以通过将字符串值'r'作为第二个参数传递给open()来显式指定模式。所以打开('D/ zhangyu.txt','r')和打开('D/ zhangyu.txt')做同样的事情。
对open()的调用返回一个File对象。 File对象表示计算机上的文件;它只是Python中另一种类型的价值,就像您已经熟悉的列表和字典一样。在上一个示例中,您将File对象存储在变量helloFile中。现在,每当你想读取或写入文件时,可以通过调用helloFile中的File对象的方法来实现。
现在你有一个File对象,你可以从它开始读取。如果要将文件的全部内容作为字符串值读取,请使用File对象的read()方法。我们继续保存在helloFile中的hello.txt File对象。
helloContent = helloFile.read()
helloContent
'Hello World!'
如果您将文件的内容视为单个字符串值,则read()方法将返回存储在文件中的字符串。
或者,您可以使用readlines()方法从文件中获取字符串值列表,每行文本都有一个字符串。例如,在与hello.txt相同的目录中创建一个名为something.txt的文件,并在其中写入以下文本:
When, in disgrace with fortune and men's eyes,
I all alone beweep my outcast state,
And trouble deaf heaven with my bootless cries,
And look upon myself and curse my fate,
确保用换行符分隔四行。
sonnetFile = open('sonnet29.txt')
sonnetFile.readlines()
sonnetFile = open('D:\something.txt')
sonnetFile.readlines()
["When, in disgrace with fortune and men's eyes,\n",
'\n',
'I all alone beweep my outcast state,\n',
'\n',
'And trouble deaf heaven with my bootless cries,\n',
'\n',
'And look upon myself and curse my fate,\n']
请注意,每个字符串值以换行符\ n结尾,除了文件的最后一行。字符串列表通常比单个字符串值更容易使用。
#### 写入文件
Python允许您以类似于print()函数“写入”字符串到屏幕的方式将内容写入文件。但是,您不能写入您以读取模式打开的文件。相反,您需要以“重新写入”模式或“追加纯文本”模式打开它,或者重写模式和追加模式。
baconFile = open('bacon.txt', 'w')
baconFile.write('Hello world!\n')
13
```
baconFile.close()
baconFile = open('bacon.txt', 'a')
baconFile.write('Bacon is not a vegetable.')
>25
baconFile.close()
baconFile = open('bacon.txt')
content = baconFile.read()
baconFile.close()
print(content)
>Hello world!
Bacon is not a vegetable.
首先,我们在写入模式下打开bacon.txt。由于还没有bacon.txt,Python会创建一个。在打开的文件上调用write()并传递write()字符串参数'Hello world! / n'将字符串写入文件,并返回写入的字符数,包括换行符。然后我们关闭文件。
要将文本添加到文件的现有内容中,而不是替换刚刚写入的字符串,我们以追加模式打开文件。我们写“Bacon is not a vegetable.”。到文件并关闭它。最后,要将文件内容打印到屏幕上,我们以默认读取模式打开文件,调用read(),将生成的File对象存储在内容中,关闭文件并打印内容。
请注意,write()方法不会像print()函数那样自动将换行字符添加到字符串的末尾。你必须自己添加这个字符。
##使用shelve模块保存变量
您可以使用shelve模块将您的Python程序中的变量保存到二进制文件。这样,您的程序可以将数据从硬盘恢复到变量。shelve模块将允许您将保存和打开功能添加到程序中。例如,如果您运行程序并输入了一些配置设置,则可以将这些设置保存到货架文件中,然后在下次运行程序时将其加载。
import shelve
shelfFile = shelve.open('mydata')
cats = ['Zophie', 'Pooka', 'Simon']
shelfFile['cats'] = cats
shelfFile.close()
要使用shelve模块读取和写入数据,您首先导入shelve。调用shelve.open()并传递一个文件名,然后将返回的shelve值存储在一个变量中。您可以对shelve值进行更改,就好像是字典一样。完成后,请对shelve上的价值调用close()。这里,我们的货架值存储在shelfFile中。我们创建一个列表cats并且写成shelfFile ['cats'] = cats,将列表存储在shelfFile中,作为与关键字'cats'相关联的值(如在字典中)。然后我们在shelfFile上调用close()。
在Windows上运行以前的代码之后,您将在当前工作目录中看到三个新文件:mydata.bak,mydata.dat和mydata.dir。
这些二进制文件包含存储在shelve上的数据。这些二进制文件的格式并不重要;你只需要知道shelve模块的作用,而不是它如何做。该模块可以让您无需担心如何将程序的数据存储到文件中。
您的程序可以使用shelve模块稍后重新打开并从这些货架文件中检索数据。存储的数据不必在读取或写入模式下打开 - 它们可以想打开就可以打开。
shelfFile = shelve.open('mydata')
type(shelfFile)
>shelve.DbfilenameShelf
shelfFile['cats']
>['Zophie', 'Pooka', 'Simon']
shelfFile.close()
在这里,我们打开Shelve文件来检查我们的数据是否正确存储。输入shelfFile ['cats']返回与之前存储的相同的列表,所以我们知道列表被正确存储,我们称之为close()。
就像字典一样,shelve具有keys()和values()方法,它将返回shelve中键和值的类似列表的值。因为这些方法返回类似列表的值而不是真正的列表,所以你应该将它们传递给list()函数,以便它们以列表的形式。
shelfFile = shelve.open('mydata')
list(shelfFile.keys())
['cats']
list(shelfFile.values())
[['Zophie', 'Pooka', 'Simon']]
纯文本可用于创建文本编辑器(如记事本或文本编辑器)中要读取的文件,但如果要从Python程序保存数据,请使用shelve模块。
从Pretty Printing中回想起,pprint.pprint()函数会将列表或字典的内容“漂亮打印”到屏幕上,而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()。我们有一个字典的列表,存储在一个变量cat。为了将列表保存在cat中,即使我们关闭了输入框,我们使用pprint.pformat()返回它作为一个字符串。一旦我们将数据作为一个字符串,我们很容易将字符串写入一个文件,我们称之为myCats.py。
import语句导入的模块本身就是Python脚本。当来自pprint.pformat()的字符串保存到.py文件时,该文件是可以像任何其他导入一样的模块。
而且由于Python脚本本身只是带有.py文件扩展名的文本文件,您的Python程序甚至可以生成其他Python程序。然后,您可以将这些文件导入脚本。
import myCats
myCats.cats
[{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}]
myCats.cats[0]
{'desc': 'chubby', 'name': 'Zophie'}
myCats.cats[0]['name']
'Zophie'
创建.py文件(与使用shelve模块保存变量相反)的好处是,因为它是一个文本文件,任何人都可以使用简单的文本编辑器读取和修改该文件的内容。但是,对于大多数应用程序,使用shelve模块保存数据是将变量保存到文件的首选方法。只有基本的数据类型(如整数,浮点数,字符串,列表和字典)可以作为简单文本写入文件。例如,文件对象不能被编码为文本。