Task07:文件与文件系统(2day)

Task07:文件与文件系统(2day)
读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
1.读文件
要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:

>>> f=open('/Users/lenovo/Desktop/text.txt','r')

标示符’r’表示读,这样,我们就成功地打开了一个文件。
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:

>>> f=open('/Users/lenovo/Desktop/notfound.txt','r')
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    f=open('/Users/lenovo/Desktop/notfound.txt','r')
FileNotFoundError: [Errno 2] No such file or directory: '/Users/lenovo/Desktop/notfound.txt'

如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:

>>> f.read()
'123'

最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:

>>> f.close()

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:

try:
    f=open('/Users/lenovo/Desktop/text.txt','r')
    print(f.read())
finally:
    if f:
        f.close()

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

>>> with open('/Users/lenovo/Desktop/text.txt','r') as f:
 print(f.read())
 123

这和前面的try … finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险。
fileObject.readline()读取整行,包括 “\n” 字符。

>>> f=open('/Users/lenovo/Desktop/text.txt','r')
>>> line=f.readline()
>>> print('读取的字符串:%s'%line)
读取的字符串:123

fileObject.readlines()用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。

>>> f.close()
>>> f=open('/Users/lenovo/Desktop/text.txt','r')
>>> lines=f.readlines()
>>> print(lines)
['123\n', '321\n', '456\n', '654']

>>> for each in lines:
 each.strip()
 print(each)

2.写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件:

>>> f=open('/Users/lenovo/Desktop/text.txt','w')
>>> f.write('The number!')
11
>>> f.close()

你可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险,当以’w’模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。如果我们希望追加到文件末尾怎么办?可以传入’a’以追加(append)模式写入。

>>> with open ('/Users/lenovo/Desktop/text.txt','w') as f:
 f.write('Hello,world!')
 
>>> with open ('/Users/lenovo/Desktop/text.txt','a') as f:
 f.write('Hello,liangxinran')

我们在这里总结一下关于open()的mode参数:

模式描述
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

3.操作文件和目录
如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。
打开Python交互式命令行,我们来看看如何使用os模块的基本功能:

>>> import os
>>> os.name
'nt'

如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统。
环境变量
在操作系统中定义的环境变量,全部保存在os.environ这个变量中,可以直接查看:

>>> os.environ
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\lenovo\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'LAPTOP-LSOA2VT0', 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 'CONFIGSETROOT': 'C:\\WINDOWS\\ConfigSetRoot', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'HOME': 'C:\\Users\\lenovo', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\lenovo', 'LNKENV': 'C:\\Program Files (x86)\\Internet Explorer\\IEXPLORE.EXE', 'LOCALAPPDATA': 'C:\\Users\\lenovo\\AppData\\Local', 'LOGONSERVER': '\\\\LAPTOP-LSOA2VT0', 'LXKSERVER': 'sdsefg', 'NUMBER_OF_PROCESSORS': '4', 'ONEDRIVE': 'C:\\Users\\lenovo\\OneDrive', 'ONEDRIVECONSUMER': 'C:\\Users\\lenovo\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'C:\\Program Files (x86)\\Razer Chroma SDK\\bin;C:\\Program Files\\Razer Chroma SDK\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files\\Intel\\WiFi\\bin\\;C:\\Program Files\\Common Files\\Intel\\WirelessCommon\\;%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem;%SYSTEMROOT%\\System32\\WindowsPowerShell\\v1.0\\;%SYSTEMROOT%\\System32\\OpenSSH\\;C:\\WINDOWS\\system32\\config\\systemprofile\\AppData\\Local\\Microsoft\\WindowsApps;F:\\matlab2018\\runtime\\win64;F:\\matlab2018\\bin;C:\\Users\\lenovo\\AppData\\Local\\Programs\\Python\\Python37\\Scripts\\;C:\\Users\\lenovo\\AppData\\Local\\Programs\\Python\\Python37\\;C:\\Users\\lenovo\\AppData\\Local\\Microsoft\\WindowsApps;', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 94 Stepping 3, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '5e03', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\WINDOWS', 'TEMP': 'C:\\Users\\lenovo\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\lenovo\\AppData\\Local\\Temp', 'USERDOMAIN': 'LAPTOP-LSOA2VT0', 'USERDOMAIN_ROAMINGPROFILE': 'LAPTOP-LSOA2VT0', 'USERNAME': 'lenovo', 'USERPROFILE': 'C:\\Users\\lenovo', 'VS140COMNTOOLS': 'F:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools\\', 'WINDIR': 'C:\\WINDOWS'})

操作文件和目录
操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:

>>> os.path.abspath('.')
'C:\\Users\\lenovo\\AppData\\Local\\Programs\\Python\\Python37'

我们这里使用os.chdir(path)改变当前工作目录到指定的路径。

>>> path='C:\\'
>>> os.chdir(path)

os.mkdir(path)创建单层目录,如果该目录已存在抛出异常。

>>> if os.path.isdir(r'.\b') is False:
 os.mkdir(r'.\B')
 os.mkdir(r'.\B\A')
 
 >>> os.mkdir(r'.\C\A')
Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    os.mkdir(r'.\C\A')
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: '.\\C\\A'

os.makedirs(path)用于递归创建多层目录,如果该目录已存在抛出异常。

>>> os.makedirs(r'.\E\A')

os.remove(path)用于删除指定路径的文件。如果指定的路径是一个目录,将抛出OSError。

>>> print("目录为:%s"%os.listdir(r'.\B\A'))
目录为:['text1.txt']
>>> os.remove(r'.\B\A\text1.txt')
>>> print("目录为:%s"%os.listdir(r'.\B\A'))
目录为:[]

os.removedirs(path)递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。

>>> os.removedirs(r'\B\A')
>>> print("目录为: %s" % os.listdir(os.getcwd()))

这里注意就是先删除文件A,然后是文件B。

小结
Python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值