目录
一.读写文件,对文件的操作(open()函数)
1.写一个文本文件text:内容为 “你好,python”,读取文件内容。复制这个文件,拷贝为text2.
2.找一张图片,复制这个图片到copy.jpg.
3.给定一个列表:['string1', 'string2', 'string3']将列表内容写入文件,每一个元素一行.
二.异常以及常见的异常处理
三.模块和包
使用open()函数对文件进行操作必须有相应的close操作.
Python中支持文件操作的函数
open()
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):
参数:最常使用的是两个位置参数和一个关键字参数file,mode, encoding
file: test.txt
绝对路径:从根目录开始的路径,一个完整的路径
相对路径:
.: 当前目录
..代表上一级目录
mode: 代表操作文件的方式
Character Meaning #默认格式为文本只读
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode #针对二进制或者字节
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newline mode (deprecated)
buffering: 缓冲,都是整数
0, 代表不缓冲,关闭
1,代表文本模式下,缓冲一行
>1: 针对我们的二进制
encoding: 编码方式
error: 错误
newline: 新行
closefd: 关闭文件描述符
返回值:
返回一个 file object
一般我们最常用的四个参数:*file, *mode, *encoding, bufferring
1.1 以手动关闭文件的方式操作
str_data = "你好,python"
data1 = open('text', 'wt', encoding='UTF-8') #以写的方式打开并创建一个text文件
result1 = data1.write(str_data)
data1.close()
data2 = open('text', 'rt', encoding='UTF-8') #以读的方式打开text文件
result2 = data2.read()
data2.close()
data3 = open('text2', 'wt', encoding='UTF-8') #将读的text文件的内容写入text2文件中
result3 = data3.write(result2)
data3.close()
1.2 以自动关闭文件的方式操作
使用 with open("1.txt", "wb") as file_obj:
可以保证在写入数据时保证不丢失,保证了数据的完整性。
str_data = "你好,python"
with open('text', 'wt', encoding='UTF-8') as file_obj1:
file_obj1.write(str_data)
with open('text', 'rt', encoding='UTF-8') as file_obj2:
result= file_obj2.read()
with open('text2', 'wt', encoding='UTF-8') as file_obj3:
file_obj3.write(result)
#在这里我们使用手动关闭文件的方式操作
注意照片需要使用对二进制或字节的操作
data = open('1.jpg.jpeg', 'rb')
result = data.read()
print(result)
data.close()
data2 = open('copy.jpg', 'wb')
result2 = data2.write(result)
data2.close()
在这里我们想把列表中的字符串写进text文件中(每行一个元素),我们需要使用字符串中的join操作,将‘\n’插入到列表每个元素的中间,来达到换行 打印的目的.
list_data = ['string1', 'string2', 'string3']
data = '\n'.join(list_data)
with open('text3', 'wt', newline='') as file_obj:
file_obj.writelines(data)
##text3文件中为:
string1
string2
string3
1.异常的完整语法:
try:
要执行的语句 #python解释器抛出异常(或者正常语句)
except:
异常处理的语句 #根据try中的语句去捕获异常
except:
异常处理的语句N
else: #当try中的语句正常执行时,执行else中的语句
try中的语句正常执行,要执行操作
finally: #无论try中的语句是否有异常都需要执行的语句
始终都要的做的语句
2. 常见的异常处理(try中的异常只能被捕获到一次)
try:
1 + '1'
1 + 1
except ZeroDivisionError:
print('ZeroDivisionError')
except IndexError:
print('IndexError')
except KeyError:
print('KeyError')
except ValueError:
print('ValueError')
except Exception:
print('最后捕获')
else:
print(1+1)
finally:
print('Finally')
#执行结果 由于在前四次中未能捕获异常,在第五次捕获到异常
最后捕获
Finally
进程已结束,退出代码0
3.用异常处理来进行读写文件的关闭
try:
file_obj = open("1.txt", "w")
file_obj.write("123")
1 / 0
except:
print("处理异常")
finally:
file_obj.close()
print("Finally")
#执行结果
处理异常
Finally
进程已结束,退出代码0
4.我们可以自动抛出异常.
使用raise可以强制抛出一个异常,当try中语句可以正常执行时,我们可以使用raise强制抛出一个我们想要处理的异常类型,然后在except中捕获去处理异常。
try:
1
raise IndexError
except IndexError:
print("Handle Index Error")
#执行结果
Handle Index Error
进程已结束,退出代码0
1.模块的概念
退出 Python 解释器后,再次进入时,之前在 Python 解释器中定义的函数和变量就丢失了。因此,编写较长程序时,建议用文本编辑器代替解释器,执行文件中的输入内容,这就是编写脚本。随着程序越来越长,为了方便维护,最好把脚本拆分成多个文件。编写脚本还有一个好处,不同程序调用同一个函数时,不用每次把函数复制到各个程序。
为实现这些需求,Python 把各种定义存入一个文件,在脚本或解释器的交互式实例中使用。这个文件就是 模块 ;模块中的定义可以 导入 到其他模块或 主 模块(在顶层和计算器模式下,执行脚本中可访问的变量集)。
模块是包含 Python 定义和语句的文件。其文件名是模块名加后缀名 .py
。在模块内部,通过全局变量 __name__
可以获取模块名(即字符串)。
2.怎样导入模块,如何导入模块中的具体内容
导入模块的语法:
import module_name #import 模块名
import module_name1, module_name2 #import 模块1,模块2...
如果你要调用模块中内容,怎么调用
module_name.变量/函数/类 #模块名.变量/函数/类
module_name.function_name() #从module_name模块中调用function_name()函数
from module_name import function_name
直接调用function_name
from module_name import * (一般情况不推荐使用)
*: 所有, 但是还是有限制
导入所有不以下划线(_)开头的名称
import sys
sys.audit()
3.import语句的实质是什么?
在python中import的实质相当于把被导入的模块执行一遍,此时我们可以在主模块中调用hct模块中的语句.相当于先把hct模块执行一遍,然后调用。
import hct
print(hct.list_data)
#hct模块中的语句
list_data = [1, 2, 3]
print('111')
print(list_data)
#执行结果
111
[1, 2, 3]
[1, 2, 3]
进程已结束,退出代码0
4.什么是包,包和目录的区别,__init__.py的作用
包是一种用“点式模块名”构造 Python 模块命名空间的方法。例如,模块名 A.B
表示包 A
中名为 B
的子模块。正如模块可以区分不同模块之间的全局变量名称一样,点式模块名可以区分 NumPy 或 Pillow 等不同多模块包之间的模块名称。
假设要为统一处理声音文件与声音数据设计一个模块集(“包”)。声音文件的格式很多(通常以扩展名来识别,例如:.wav
, .aiff
, .au
),因此,为了不同文件格式之间的转换,需要创建和维护一个不断增长的模块集合。为了实现对声音数据的不同处理(例如,混声、添加回声、均衡器功能、创造人工立体声效果),还要编写无穷无尽的模块流。下面这个分级文件树展示了这个包的架构:
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
包和目录的区别:目录在pycharm中就是一个文件夹,用来放置资源文件。
对于包而言,与目录不同之处就是包会自动创建一个__init__.py文件。 包中包含一个模块和一个__init__.py文件。
Python 只把含 __init__.py
文件的目录当成包。这样可以防止以 string
等通用名称命名的目录,无意中屏蔽出现在后方模块搜索路径中的有效模块。 最简情况下,__init__.py
只是一个空文件,但该文件也可以执行包的初始化代码,或设置 __all__
变量,