做网站免费吗,wordpress外链图片备份,制作宣传片拍摄公司,中山建网站Python 基础入门前五篇#xff1a;
Python 基础入门–简介和环境配置Python基础入门_2基础语法和变量类型Python基础入门_3条件语句和迭代循环Python基础入门_4函数Python基础入门_5面向对象基础
这次将介绍有关文件和异常的处理#xff0c;包括读写文本文件、二进制文件、…Python 基础入门前五篇
Python 基础入门–简介和环境配置Python基础入门_2基础语法和变量类型Python基础入门_3条件语句和迭代循环Python基础入门_4函数Python基础入门_5面向对象基础
这次将介绍有关文件和异常的处理包括读写文本文件、二进制文件、JSON 文件异常处理以及 pathlib 模块的介绍。
本文的目录如下 1. 文件
简介
Python 中读取、写入文件都可以通过方法 open() 实现该方法用于打开一个文件然后返回文件对象如果文件不存在或者无法打开会报错 OSError。
open 方法的语法如下
open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone)几个参数说明:
file必需文件路径相对或者绝对路径皆可mode可选文件打开的模式buffering设置缓冲encoding一般采用 utf8errors报错级别newline区分换行符closefd传入的 file 参数类型
常用的文件打开模式如下
操作模式具体含义r读取(默认文件打开模式)w写入会截断前面的内容)x写入如果文件已经存在会产生异常a追加将内容写入到已有文件末尾b二进制模式t文本模式(默认)更新(既可以读又可以写)
其中 r 、 w 、a 是三选一表明读取或者写入然后可以添加其他几种模型即还存在
rb , r, rbwb, w, wbab, a, ab
对于 open 方法返回的 file 文件对象它常用函数有
close()关闭文件flush()将内部缓冲区数据立刻写入文件read([size])从文件读取指定的字节数如果没有或者是负数值则读取所有readline()读取整行包含换行符 \n 字符readlines([sizeint])读取所有行并返回列表若给定 sizeint0返回总和大约为 sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。write(str)将字符串写入文件返回的是写入字符的长度writelines(sequence)向文件写入一个序列字符串列表如果需要换行需要自己添加每行的换行符seek(offset[, whence])设置文件当前位置tell()返回文件当前位置。truncate([size]从文件的首行首字符开始截断截断文件为 size 个字符无 size 表示从当前位置截断截断之后后面的所有字符被删除其中 Windows 系统下的换行代表 2个字符大小。
读取文本文件
读取文本文件必须传入文件路径然后打开模式指定为 r 接着就就是通过 encoding 参数指定编码当然不设置这个编码参数它默认值是 None 读取文件将采用操作系统默认的编码通常如果文件内容不带有中文这种方法是没问题的如果带有中文内容则必须指定 encodingutf8 才能正常打开文件。
以下是一个使用例子
# 方法1
f open(test.txt, r)
print(f.read())
f.close()输出结果
life is short, I use Python.
Machine Learning
Computer Vision这是第一种使用方法这种方法的问题就是如果忘记调用 close 方法关闭文件会出现错误因此推荐使用上下文语法通过 with 关键字指定文件对象的上下文环境并在离开上下文环境时自动释放文件资源此外读取文件内容可以直接调用 read() 方法也可以采用 for-in 循环读取
# 方法2
with open(test.txt, r) as fr:print(fr.read())
# 方法3 读取文件也可以采用 for-in 循环逐行读取
with open(test.txt, r) as fr:for line in fr:print(line.strip())2. 异常
Python 有两种错误很容易辨认语法错误和异常。
语法错误也称为解析错比如下面这个例子
while Trueprint(hello)会报错误这里指出语法错误的地方就是缺少非常重要的冒号 :
File ipython-input-41-b385275d6655, line 1while True^
SyntaxError: invalid syntax而异常是运行期检测到的错误即解析成功后开始运行时的错误比如执行除法操作时候除数是 0 的情况读取文件的时候文件路径错误变量没有定义的情况等等。
异常处理
异常的处理就是采用 try-exception 语句例子如下
def read_file(file_name):file_contents Nonetry:with open(file_name, r, encodingutf-8) as f:file_contents f.read()except FileNotFoundError:print(无法打开指定的文件!)except LookupError:print(指定了未知的编码!)except UnicodeDecodeError:print(读取文件时解码错误!)else:print(读取文件成功)finally:print(程序执行完毕)return file_contents上述代码中try 语句是这样执行的
先执行 try 语句即 try 和 except 之间的句子如果没有异常发生就忽略 except 然后按顺序执行 else 语句finally 语句如果发生异常那就忽略 try 语句中发生异常部分后面的代码然后执行和异常类型一样的 except 语句之后执行 finally 语句如果一个异常没有与任何的 except 匹配那么这个异常将会传递给上层的 try 中。
一个 try 语句可能包含多个 except 子句分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的 try 子句中的异常进行处理而不是其他的 try 的处理程序中的异常。
一个 except 子句可以同时处理多个异常这些异常将被放在一个括号里成为一个元组例如:
except (FileNotFoundError, LookupError, UnicodeDecodeError) as e:print(e)上述情况可以添加一个 except 语句忽略异常的名称它将被当作通配符使用。你可以使用这种方法打印一个错误信息然后再次把异常抛出如下所示
import sysdef read_file2(file_name):file_contents Nonetry:with open(file_name, r, encodingutf-8) as f:file_contents f.read()except (LookupError, UnicodeDecodeError) as e:print(e)except:print(发生了未知的错误, sys.exc_info()[0])else:print(读取文件成功)finally:print(程序执行完毕)return file_contents不过其实还有一种比较偷懒的写法直接用 Exception 捕获所有异常
import sys
def read_file3(file_name):file_contents Nonetry:with open(file_name, r, encodingutf-8) as f:file_contents f.read()except Exception as e:print(e)else:print(读取文件成功)finally:print(程序执行完毕)return file_contents当然推荐的写法还是前面几种写法这样可以针对不同异常情况有不同的做法。
另外这里的 else 语句是 try 语句执行成功后继续执行的语句而 finally 则是无论是否发生异常都会执行的语句它是定义了无论任何情况都会执行的清理行为。
有一些方法是有预定义的清理行为比如说上述说到的关键词 with 语句就定义了无论文件操作如何都会执行关闭文件对象的行为
这两个语句是可选择的不是使用的语句。
抛出异常
上述的异常处理在出现异常后是可以继续执行后续的代码(try-exception 后面的语句)即不会终止程序的执行但如果希望发生异常就终止程序运行可以采用 raise 关键字如下代码所示
try:with open(file_name, r, encodingutf-8) as f:file_contents f.read()
except Exception as e:print(e)raise或者如下所示raise 后面加上指定的异常名称和参数
raise NameError(HiThere)最后更多异常处理的例子可以查看 《总结Python中的异常处理》文章给出了关于异常的最佳实践
只处理你知道的异常避免捕获所有异常然后吞掉它们。抛出的异常应该说明原因有时候你知道异常类型也猜不出所以然。避免在 catch 语句块中干一些没意义的事情捕获异常也是需要成本的。不要使用异常来控制流程那样你的程序会无比难懂和难维护。如果有需要切记使用 finally 来释放资源。如果有需要请不要忘记在处理异常后做清理工作或者回滚操作。
3. 更多文件和异常的例子
介绍完文件和异常接下来介绍更多的文件操作搭配异常处理。
写入文件
写入文件只需要设置文件打开模式是写入模型即 w 代码例子如下所示这里实现读取一个文件的内容然后写入到一个新的文件中。
def save_to_file(input_file, outputfile, write_modew):file_contents read_file(input_file)try:with open(outputfile, write_mode, encodingutf-8) as fw:fw.write(file_contents)except IOError as ioerror:print(ioerror)print(写入文件出错)
input_file test.txt
output_file new_test.txt
save_to_file(input_file, output_file, write_modew)读取二进制文件
读写文本文件的例子都有了接下来就是二进制文件的读取和写入这里实现一个复制图片文件的功能如下所示读取和保存图片时候采用的文件模型分别是 rb 和 wb 。
def copy_image_file(input_image, output_image):try:with open(input_image, rb) as img1:data img1.read()print(type(data))with open(output_image, wb) as out:out.write(data)except FileNotFoundError as e:print(指定的文件无法打开--{}.format(input_image))except IOError as e:print(读写文件出现错误)finally:print(程序执行结束)使用例子
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
input_image example.jpg
output_image copyed.jpg
copy_image_file(input_image, output_image)采用的用于复制的图片如下所示 这里在 jupyter notebook 中展示图片的代码如下
%matplotlib inline
img Image.open(input_image)
print(np.asarray(img, dtypenp.uint8).shape)
plt.imshow(img);这里最好一行代码 plt.imshow(img)如果不加分号会输出图片变量的信息即 matplotlib.image.AxesImage at 0x1d0d1161dd8然后再显示图片而加分号则直接显示图片。
读写 JSON 文件
上述介绍了如何保存文本数据和二进制数据到文件中但如果我们希望保存的是列表或者字典的数据那么可以选择采用 JSON 格式。
JSON 是 JavaScript Object Notion 的缩写现在广泛应用于跨平台跨语言的数据交换因为它是纯文本任何编程语言都可以狐狸纯文本。更多关于它的介绍可以查看官网–http://json.org/
JSON 的数据类型和 Python 数据类型的对应关系分别如下面两张表所示
JSON-Python:
JSONPythonobjectdictarrayliststringstrnumber(int / real)int / floattrue / falseTrue / FalsenullNone
Python-JSON
PythonJSONdictobjectlist, tuplearraystrstringint, float, int- float-derived EnumsnumberTrue / Falsetrue / falseNonenull
在 Python 中使用 json 库就可以保存或者读取 JSON 格式的文件代码例子如下
import json
# 先生成一个json文件
test_dict {name: python,age: 40,package: [os, json, sys],features: {data_analysis: [pandas, matplotlib],deep_learning: [scikit-learn, tensorflow, pytorch, keras]}
}
try:with open(test_data.json, w, encodingutf-8) as fw:json.dump(test_dict, fw, indent4, separators(,, : ))
except IOError as e:print(e)
finally:print(程序执行完毕)这是一个保存为 JSON 文件的代码调用 dump() 方法然后读取代码如下所示
# 读取 json 文件
try:with open(test_data.json, r) as fr:contents json.load(fr)for key, val in contents.items():print({}: {}.format(key, val))
except IOError as e:print(e)
print(读取完毕)这里调用方法 load() 方法。
在 json 库中比较重要的是下面四个方法
dump 将 Python 对象按照 JSON 格式序列化到文件中dumps 将 Python 对象处理为 JSON 格式的字符串load将文件中的 JSON 数据反序列化为 Python 对象loads将字符串内容反序列化为 Python 对象
这里面只要方法以 s 结尾那就是和字符串有关系而如果不带那就是和文件有关系了。
这里的序列化和反序列化其中序列化就是指将数据结果或者对象状态转换为可以存储或者传输的形式也就是一系列字节的形式而从这些字节提取数据结构的操作就是反序列化。
在 Python 中序列化和反序列化还可以采用 pickle 和 shelve 两个库但它们仅适用于 Python不能跨语言。
删除文件或者文件夹
对于删除文件可以采用这两种方法分别用到 os 和 pathlib 两个模块
os.remove()pathlib.Path.unlink() 这个方法也可以删除链接
删除文件夹有三种方法不过前两者都只能删除空文件夹
os.rmdir() 只能删除空的文件夹pathlib.Path.rmdir() 删除空文件夹shutil.rmtree() 可以删除非空文件夹
4. pathlib 模块
最后介绍一个在 Python 3.4 版本加入的新模块–pathlib 这是一个可以很好处理文件相关操作的模块。
首先对于文件路径最大的问题可能就是 Unix 系统和 Windows 系统采用的斜杠不同前者是 / 而后者是 \ 因此之前的处理文件路径拼接的方式可以采用 os.path.join 方法例如
data_folder source_folder/python/
file_path os.path.join(data_folder, abc.txt)
print(file_path)
# 输出 source_folder/python/abc.txt但现在有了一个更加简洁的方法就是采用 pathlib 模块的 Path 方法如下所示
from pathlib import Path
data_folder Path(source_folder/python/)
file_path data_folder / abc.txt
print(file_path)
# 输出 source_folder\python\abc.txt需要注意两件事情
采用 pathlib 的方法应该使用 / 斜杠Path() 方法会自动根据当前系统修改斜杠比如上述例子就更改为 Windows 的 \\文件路径的拼接直接采用 / 即可不需要再写成 os.path.join(a,b) 更加方便简洁。
当然pathlib 并不只是有这个用途它还可以完成更多事情
读取文件内容不需要打开和关闭文件如下所示直接调用 read_text 方法即可读取内容
data_folder Path(./)
file_path data_folder / test.txt
print(file_path.read_text())pathlib 可以更加快速容易实现大部分标准的文件操作如下所示分别执行打印文件路径文件后缀文件名不包含文件后缀部分、判断文件是否存在的四个操作。
filename Path(./test.txt)
print(filename.name) # 输出 test.txt
print(filename.suffix) # 输出 .txt
print(filename.stem) # 输出 testif not filename.exists():print(file does not exist!)
else:print(file exists)可以显式将 Unix 路径转换为 Windows 形式的
from pathlib import PureWindowsPath
filename Path(source/test.txt)
path_on_windows PureWindowsPath(filename)
print(path_on_windows) # 输出 source\test.txt当然对于上述代码如果希望安全的处理斜杠可以显式定义为 Windows 格式的路径然后 pathlib 会将其转换为可以在当前系统使用的形式
filename PureWindowsPath(source/test.txt)
correct_path Path(filename)
print(correct_path)
# 在 windows 输出 source\test.txt
# 在 Mac/Linux 输出 source/test.txt最后还可以利用 pathlib 将相对路径的文件解析生成如 file:// 形式的 urls如下所示
import webbrowser
filename Path(./test.txt)
webbrowser.open(filename.absolute().as_uri())当然pathlib 的用法还有不少更多的用法可以查看官网的介绍
https://docs.python.org/3/library/pathlib.html 参考
Python3 File(文件) 方法Python3 错误和异常Day11–文件和异常JSON 的官方网站《总结Python中的异常处理》https://stackoverflow.com/questions/6996603/delete-a-file-or-folderhttps://medium.com/ageitgey/python-3-quick-tip-the-easy-way-to-deal-with-file-paths-on-windows-mac-and-linux-11a072b58d5fhttps://docs.python.org/3/library/pathlib.html 小结
本文简单介绍 Python 文件和异常的知识点如何读写文本文件、二进制文件和 json 文件然后异常处理最后介绍一个新的处理文件相关操作的模块 pathlib .
此外本文的代码都上传到我的 github 上了
https://github.com/ccc013/Python_Notes/blob/master/Practise/file_and_exception_example.ipynb
欢迎关注我的微信公众号–算法猿的成长或者扫描下方的二维码大家一起交流学习和进步