20220728Python学习
文件与文件路径
文件有两个关键属性:“文件名”(通常写成一个单子)和“路径”。路径指明了文件在计算机上的位置。文件名中,最后一个句点之后的部分称为文件的“扩展名”,它指出了文件的类型。
Windows上的倒斜杠以及OS X和Linux上的正斜杠
将单个文件和路径上的文件夹名称的字符串传递给它,os.path.join()
就会返回一个文件路径的字符串,包含正确的路径分隔符。
>>> import os >>> os.path.join('usr', 'bin', 'spam') 'usr\\bin\\spam'
请注意,倒斜杠有两个,因为每个倒斜杠都需要另一个倒斜杠字符来转义。
>>> myFiles = ['accounts.txt', 'details.csv', 'invite.docx'] >>> for filename in myFiles: print(os.path.join('C:\\user\\xfsadmin', filename))
当前工作目录
利用os.getcwd()函数,可以取得当前工作路径的字符串,并可以利用os.chdir()改变它。
>>> import os >>> os.getcwd() 'C:\\Users\\Xfsadmin' >>> os.chdir('c:\\Windows\\System32') >>> os.getcwd() 'c:\\Windows\\System32'
绝对路径与相对路径
绝对路径:总是从根文件夹开始;
相对路径:它相对于程序的当前工作目录;
用os.makedirs()创建新文件夹
>>> import os >>> os.makedirs('c:\\Users\\xfsadmin\\test')
如果父文件夹不存在,那么os.makedirs()
也会创建父目录。
os.path模块
os.path模块包含了许多与文件名和文件路径相关的有用函数。
os.path模块的完整文档:
处理绝对路径和相对路径
os.path模块提供了一些函数,返回一个相对路径的绝对路径,以及检查给定的路径是否为绝对路路径。
-
调用
os.path.abspath(path)
将返回参数的绝对路径的字符串,这是将相对路径转换为绝对路径的简便方法。 -
调用
os.path.isabs(path)
,如果参数是一个绝对路径,就返回True,如果参数是一个相对路径,就返回False。 -
调用os.path.relpath(path, start)将返回从start路径到path的相对路径的字符串。如果没有提供start,就使用当前目录作为开始路径。
>>> os.path.abspath('.') 'c:\\Windows\\System32' >>> os.path.abspath('.\\Scripts') 'c:\\Windows\\System32\\Scripts' >>> os.path.isabs('.') False >>> os.path.isabs(os.path.abspath('.')) True
因为在os.path.abspath()
调用时,当前目录是c:\\Windows\\System3
,所以"点"文件夹指的是绝对路径c:\\Windows\\System3
>>> os.path.relpath('c:\\Windows', 'c:\\') 'Windows' >>> os.path.relpath('c:\\Windows', 'c:\\spam\\eggs') '..\\..\\Windows' >>> os.getcwd() 'c:\\Windows\\System32'
调用os.path.dirname(path)
将返回一个字符串,它包含path参数中最后一个斜杠之前的所有内容。调用os.path.basename(path)
将返回一个字符串,它包含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')
请注意,可以调用os.paht.dirname()
和os.paht.basename()
,将它们的返回值放在一个元组中,从而得到同样的元组。
>>> (os.path.dirname(calcFilePath), os.path.basename(calcFilePath)) ('C:\\Windows\\System32', 'calc.exe')
如果需要两个值,os.path.split()
是很好的快捷方法。
同时请注意,os.paht.split()
不会接受一个文件路径并返回每个文件夹的字符串的列表。如果需要这样,请使用split()
字符串方法,并根据os.paht.sep
中的字符串进行分割。
>>> calcFilePath.split(os.path.sep) ['C:', 'Windows', 'System32', 'calc.exe']
在OS X和Linux系统上,返回的列表头上有一个空字符串:
>>> '/usr/bin'.split(os.path.sep) ['', 'usr', 'bin']
split()
字符串方法将返回一个列表,包含该路径的所有部分。
查看文件大小和文件夹内容
-
调用
os.path.getsize(path)
将返回path参数中文件的字节数; -
调用
os.listdir(path)
将返回文件名字符串的列表,包含path参数中的每个文件。(请注意,这个函数在os模块中,而不是os.path)
>>> os.path.getsize('C:\\Windows\\System32\\cmd.exe') 289792 >>> os.listdir('C:\\Windows\\System32') ['0409', '69fe178f-26e7-43a9-aa7d-2b616b672dde_eventlogservice.dll', 'ztrace_maps.dll']
如果想要知道这个目录下所有文件的总字节数,就可以同时使用os.path.getsize()
和os.listdir()
。
import os totalSize = 0 for filename in os.listdir('C:\\Windows\\System32'): totalSize = totalSize + os.path.getsize(os.path.join('C:\\Windows\\System32', filename)) print(totalSize)
请注意,在调用os.path.getsize()
时,使用了os.path.join()
来连接文件夹名称和当前的文件名。os.path.getsize()
放回的整数添加到totalSize中。
检查路径有效性
-
如果path参数所指的文件或文件夹存在,调用
os.path.exists(path)
将返回True,否则返回False。 -
如果path参数存在,并且是一个文件,调用
os.paht.isfile(path)
将返回True,否则返回False。 -
如果path参数存在,并且是一个文件夹,调用
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('C:\\Windows\\System32\\calc.exe') False >>> os.path.isfile('C:\\Windows\\System32\\calc.exe') True
利用os.path.exists()函数,可以确定DVD或闪存盘,当前是否连接在计算机上。
>>> os.path.exists('D:\\') True
文件读写过程
在Python中,读写文件有3个步骤:
-
1)调用open()函数,返回一个File对象;
-
2)调用File对象的read()或write()方法;
-
3)调用File对象的close()方法,关闭该文件;
用open()函数打开文件
要用open()
函数打开一个文件,就要向它传递一个字符串路径,表明希望打开的文件。既可以是绝对路径,也可以是相对路径。open()
函数返回一个File对象。
>>> helloFile = opne('C:Usersxfsadminhello.txt')
在Python中卡达文件时,读模式是默认的模式。如果你不希望依赖于Python的默认值,也可以明确指明该模式,向open()
传入字符串r
。
>>> helloFile = opne('C:Usersxfsadminhello.txt', 'r')
读取文件内容
将整个文件的内容读取为一个字符串值,就是用File对象的read()方法。
>>> helloContent = helloFile.read() >>> helloContent 'Hello world!'
或者,可以使用readlines()
方法,从该文件取得一个字符串的列表。列表中的每个字符串就是文本中的每一行。
>>> sonnetFile = open('sonnet29.txt') >>> sonnetFile.readlines()
请注意,每个字符串都以一个换行符\n
结束。除了文件的最后一行,与单个大字符串相比,字符串的列表通常更容易处理。
写入文件
Python允许你将内容写入文件,方式与print()
函数将字符串“写”到屏幕上类似。但是,如果打开文件时用读模式,就不能吸入文件。
写模式将覆写原有的文件,从头开始,就像你用一个新值覆写一个变量的值。将w
作为第二个参数传递给open(),以写模式打开该文件。将a
作为第二个参数传递给open(),以添加模式打开该模式。
如果传递给open()的文件名不存在,写模式和添加模式都会创建一个新的空文件。在读取或写入文件后,调用close()
方法,然后才能再次打开该文件。
>>> 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()
,将得到的内容保存在content中,关闭该文件,并打印content
。
请注意,write()
方法不会向print()
函数那样,在字符串的末尾自动添加换行符。必须自己添加该字符。
用shelve模块保存变量
利用shelve模块,将Python程序中的变量保存倒二进制的shelf文件中。shelve模块让你在程序中添加“保存”和“打开”功能。
>>> import shelve >>> shelfFile = shelve.open('mydata') >>> cats = ['Zophie', 'Pooka', 'Simon'] >>> shelfFile['cats'] = cats >>> shelfFile.close()
导入shelve模块。调用函数shelve.open()并传入文件名,然后将返回的值保存在一个变量中。可以对这个变量的shelf值进行修改,当你完成时,在这个shelf值上调用close()。
我们创建了一个列表cats,并写下shelfFile['cats'] = cats
,以将cats列表保存在shelfFile中,并作为键'cats'
关联值。
>>> shelfFile = shelve.open('mydata') >>> type(shelfFile) <class 'shelve.DbfilenameShelf'> >>> shelfFile['cats'] ['Zophie', 'Pooka', 'Simon'] >>> shelfFile.close()
用pprint.pformat()函数保存变量
pprint.pprint()
函数将列表或字典中的内容"美观地输出"到屏幕,而pprint.pformat()
函数将返回同样的文本字符,但不输入它。
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()
Python脚本本身也是带有.py文件扩展名的文本文件,因此你的Python程序甚至可以生成其他Python程序,然后可将这些文件导入脚本中。