Python基础(七)——文件和异常
1.1 读取整个文件
我们可以创建一个 test.txt 并写入一些内容,使用 python 读文件操作,读出文本内容。
1 with open(r'e:\test.txt') as file_object: 2 contents = file_object.read() 3 print(contents.rstrip()) # 可以去除末尾空格(补充:.strip() 去除头尾空格,lstrip() 去除头部空格) 4 print(file_object)
解析:
open() 函数:python 中无论以何种方式使用文件(读取 or 添加等),都需要先 open() 文件。在这里,我们使用 open() 函数打开文件,并将对象存储于 file_object(此对象只能在 with 代码块中使用,如想在with之外用,详见 1.3)
注意:很奇怪,没有 close() 函数,这与 java 文件操作尤为不同。python 允许你自己 close ,只是如果你的 close 函数因为异常,而轮不到执行,则文件不会关闭。可能会造成文件数据受损。第二种可能,close 函数过早执行,而后面还有读写操作,则会出现更多错误。幸运的是 python 可以帮我们找到恰当的关闭时机,并且帮助我们执行关闭操作。
以下为输出内容,1~3 行是我的文本内容,最后一行是 file_object 对象:
1 1.2345 2 2345 3 2345 4 <_io.textiowrapper name='e:\\test.txt' mode='r' encoding='cp936'>
1.2 逐行读取
1 with open(r'e:\test.txt') as file_object: 2 for line in file_object: 3 print(line.rstrip())
注意第三行,如果没有使用 .rstrip() 函数,则输出的每一行之间都有空格。解释:因为在文件中,每行的末尾都有一个看不见的换行符,而 print 函数还会自动加上换行符,所以,一共有两个换行符,使用 .rstrip() 函数可以消除多余的空白行。
输出:
1 1.2345 2 2345 3 2345
1.3 存储各行的列表
由于 1.1 中的 with 的限制,使用 readlines() 可破:
1 file_content = [] 2 with open(r'e:\test.txt') as file_object: 3 file_content = file_object.readlines() 4 5 for line in file_content: 6 print(line.rstrip())
输出:
1 1.2345 2 2345 3 2345
如果第三行使用 readline 则只会读取一行,可实验一番。
2.1 写入空文件
1 with open(r'e:\test.txt', 'w') as file_object: 2 file_object.write('aaaasssddd\ndddaass')
解析:
第一行,依旧使用 open() 函数打开文件(文件不存在则自动创建),传入参数 w,告诉 python 以 写模式 打开文件(r 读模式,w 写模式,a 附加模式,r+ 读写模式。如果省略,默认读模式)。
注意:python 在 w 模式打开文件时,在返回文件对象 file_object 的时候,会清空文件内容。同时,\n 表示换行,无需写成 \\n 或者 r "\n" 等。write 不会再末尾自动加换行符,需主动加 \n。
2.2 附加到文件
1 with open(r'e:\test.txt', 'a') as file_object: 2 file_object.write('我是附加的内容\n我也是') 3 4 with open(r'e:\test.txt') as file_object2: 5 content = file_object2.read() 6 print(content)
1 aaaasssddd 2 dddaass我是附加的内容 3 我也是
3.1 异常和 try-except-else 代码块
普通异常处理同 java 基本一致,如下两个例子:
1 # 文件异常 2 try: 3 with open(r'e:\test3.txt') as file_object2: 4 content = file_object2.read() 5 except filenotfounderror: 6 print('文件不存在') 7 else: 8 print(content)
try-except-else 代码块工作原理:执行 try 中可能出错的代码快,出错则执行 except ,顺利则执行 else 代码块。
4.1 os 常用函数补充
- os.remove(path) 删除一个文件。os.removedir(path) 删除空目录。shutil.rmtree(path) 递归删除整个目录
- os.getcwd() 查看当前目录
- os.path.realpath(__file__) 查看当前运行文件路径
- os.listdir(path) 返回该路径的目录名
- os.path.exists(path) 判断文件 or 目录是否存在
- os.path.split(path) 返回路径的目录名和文件名(path可以是文件也可是目录)
- os.path.isdir(path)
- os.path.isfile(path)
- os.path.realpath(path) 得到绝对(软连接有效)路径
- os.path.abspath(path) 得到当前文件绝对路径
- os.path.splitext(path) 分离文件路径和文件名。如果路径是目录,则后缀为空字符串(path可以是文件也可是目录)
- os.path.basename(path) 返回路径最后一级(path可以是文件也可是目录)
- os.path.dirname(path) 与上一条相反,返回路径目录路径
- os.path.join(path,file) 连接路径和文件名。类似字符串相加
- os.chdir(path) 切换路径。path不能是是一个文件路径,是目录
1 import os 2 import shutil 3 # print(os.remove(r'e:\test\test.py')) # 删除文件 4 # print(os.removedirs(r'e:\test')) # 删除空目录 5 print(shutil.rmtree(r'e:\test')) # 递归删除目录 6 print(os.getcwd(), #f:\projects\facialexpress 7 '\t', 8 os.path.realpath(__file__)) # f:\projects\facialexpress\test.py 9 10 print(os.path.split(r'e:\myeclipse\common\artifacts.xml')) 11 print(os.path.isfile(r'e:\myeclipse\common\artifacts.xml')) 12 print(os.path.isdir(r'e:\myeclipse\common\artifacts.xml')) 13 print(os.path.abspath(os.curdir)) 14 print(os.path.realpath(os.curdir)) 15 print(os.path.splitext(r'e:\myeclipse\common\artifacts.xml')) 16 print(os.path.basename(r'e:\myeclipse\common')) 17 print(os.path.basename(r'e:\myeclipse\common\artifacts.xml')) 18 print(os.path.dirname(r'e:\myeclipse\common\artifacts.xml')) 19 print(os.path.join(os.getcwd(),'test.py')) 20 # 以下测试 os.chdir() 切换目录 21 print('==========','\n', os.getcwd()) # f:\projects\facialexpress 22 os.chdir(r'c:\windows') 23 print('--->',os.getcwd()) # c:\windows
1 none 2 f:\projects\facialexpress f:\projects\facialexpress\test.py 3 ('e:\\myeclipse\\common', 'artifacts.xml') 4 true 5 false 6 f:\projects\facialexpress 7 f:\projects\facialexpress 8 ('e:\\myeclipse\\common\\artifacts', '.xml') 9 common 10 artifacts.xml 11 e:\myeclipse\common 12 f:\projects\facialexpress\test.py 13 ========== 14 f:\projects\facialexpress 15 ---> c:\windows
上一篇: 分析node事件循环和消息队列
下一篇: 如何利用node实现静态文件缓存详解
推荐阅读