python小白考前复习
函数简介
函数就是一个用于专门实现某个功能的代码块(可重用),而模块就是大量具有相似功能的函数集合成的文件。可以这么理解,函数就是螺丝刀,你每次拧螺丝的时候把它取出来,模块就是一个工具包,这个包里放得都是跟螺丝有关的工具,它们有相似的功能。
-
函数,一个用于专门实现某个功能的代码块(可重用)。
-
内置函数
-
自定义函数
-
-
模块,集成了很多功能的函数集合。
-
内置模块,Python内部帮助我们提供好的。
import decimal v1 = decimal.Decimal("0.1") v2 = decimal.Decimal("0.2") v3 = v1 + v2 print(v3) # 0.3
-
第三方模块,网上下载别人写好的模块(功能集合)。
-
自定义模块
-
判断路径
import os
#os可以判断该路径是否存在
exists = os.path.exists("info.text")
print(exists)
文件
文件操作
在学习文件操作之前,先来回顾一下编码的相关以及先关数据类型的知识。
-
字符串类型(str),在程序中用于表示文字信息,本质上是unicode编码中的二进制。
name = "武沛齐"
-
字节类型(bytes)
-
可表示文字信息,本质上是utf-8/gbk等编码的二进制(对unicode进行压缩,方便文件存储和网络传输。)
name = "武沛齐" data = name.encode('utf-8') print(data) # b'\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90' result = data.decode('utf-8') print(result) # "武沛齐"
-
可表示原始二进制(图片、文件等信息)
-
基本知识
文件类型
- 文本文件
- 二进制文件
模式
- r:读文件(默认是读文本文件)
- w:写文件,打开一次会清空文件原有内容再写
- a:追加写,不会在下一次打开时清空
- t:文本文件,一般可省略
- b:二进制文件
- +:
- x:文件存在会报错,不存在会创建
mode的第一个字母表示对其的操作,第二个字母是文件类型
我们来看以下两段代码的区别
第一段代码用"rb"模式,是直接读取的文件原始字节序列,它不会进行解码操作,rb 模式通常用于读取非文本文件,如图片、音频、视频或二进制数据文件
第二段代码是读取的文本内容,encoding是为了指明原文件用的是哪种编码模式,从而以同样模式进行解码
file_object=open("天下之主.txt",mode="rb")
data=file_object.read()
print(data.decode("utf-8"))
file_object=open("天下之主.txt",mode="rt",encoding="utf-8")
data=file_object.read()
file_object.close()
print(data)
在Python中,写入文件和实现文件定位是通过内置的文件操作方法完成的。以下是一些基本步骤和示例:
写入文件:
-
打开文件:
使用open()
函数以写入模式打开文件。你可以使用'w'
(写入模式,会覆盖文件内容)或'a'
(追加模式,会在文件末尾添加内容)。with open('filename.txt', 'w', encoding='utf-8') as file: # 执行文件写入操作
-
写入内容:
使用文件对象的.write()
方法写入字符串。file.write("这是一些文本数据。\n")
-
写入多行:
可以一次性写入多行文本,或使用循环写入多行。lines = ["第一行文本", "第二行文本", "第三行文本"] with open('filename.txt', 'w', encoding='utf-8') as file: for line in lines: file.write(line + "\n")
实现文件定位:
-
获取当前位置:
使用文件对象的.tell()
方法获取当前文件光标的位置。with open('filename.txt', 'r+', encoding='utf-8') as file: current_position = file.tell() print(f"当前位置:{current_position}")
-
移动到指定位置:
使用文件对象的.seek(offset, whence)
方法移动文件光标到指定位置。offset
是要移动的字节数。whence
是一个可选参数,指定从哪里开始移动(0
表示文件开头,1
表示当前位置,2
表示文件末尾)。
with open('filename.txt', 'r+', encoding='utf-8') as file: file.seek(5) # 从文件开头移动5个字节
-
读取和写入到特定位置:
你可以结合.seek()
和读写方法来操作文件的特定部分。with open('filename.txt', 'r+', encoding='utf-8') as file: file.seek(0) # 移动到文件开头 content = file.read(10) # 读取10个字节的内容 print(content) file.seek(2) # 移动到文件开头的第2个字节 file.write("新的数据") # 写入新数据
注意事项:
- 使用
'r+'
模式打开文件时,可以实现读写操作,但需要确保文件已经存在。 - 文件定位操作通常与
'r+'
、'w+'
或'a+'
模式结合使用,因为这些模式允许读写访问。 - 使用
.seek()
方法时,如果移动超出了文件的范围,光标会停留在文件末尾。
通过这些基本操作,你可以在Python中灵活地进行文件写入和定位,实现各种文件处理任务。
+模式
这是一段文本
神秘主义
哆啦
圣者之心
葫芦玩
r+又可读又可写
f=open("天下之主.txt","r+",encoding="utf-8")
f_content=f.read()
print(f_content)
f.write("root")
f.close()
效果如下
神秘主义
哆啦
圣者之心
葫芦玩root
如果我们调换读写顺序,会由于光标问题出现捣乱
f=open("天下之主.txt","rt+")
f.write("root")
f_content=f.read()
print(f_content)
f.close()
输出为
主义
哆啦
圣者之心
葫芦玩
文本变成这样
root主义
哆啦
圣者之心
葫芦玩
刚开始光标位置在起始位置,直接写root就覆盖了内容,写完后,再读,光标从当前位置读取,故只有“主义”及后面的内容
但对于wt+,光标位置永远在开头
file_object = open('天下之主.txt', mode='wt+')
# 读取内容
data = file_object.read()
print(data)
# 写入内容
file_object.write("你好呀")
# 将光标位置重置起始
file_object.seek(0)
# 读取内容
data = file_object.read()
print(data)
file_object.close()
xt+:默认光标位置:起始位置(新文件)
at+:默认光标位置:末尾
read
读n个字符(字节)
f = open('天下之主.txt', mode='r', encoding='gbk')
# 读1个字符
data = f.read(1)
f.close()
print(data) # 神
f = open('天下之主.txt', mode='rb')
f = open('天下之主.txt', mode='rb')
# 读1个字节
data = f.read(1)
f.close()
print(data,type(data))#b'\xc9' <class 'bytes'>
所以你可以一个接着一个读
f = open('天下之主.txt', mode='rt', encoding='gbk')
chunk1= f.read(1)
chunk2= f.read(1)
f.close()
print(chunk1,chunk2)#神 秘
一行一行读
可以减轻读到大文件的压力
f = open('天下之主.txt', mode='r', encoding='gbk')
v1 = f.readline()
print(v1)
v2 = f.readline()
print(v2)
f.close()
输出如下,每一个输出底下都有一行空白
神秘主义
哆啦
这是因为在文档里的每一行末尾都有一个没出现的\n
,而print默认也会有一个\n
,故会空一行,你可以通过strip方法去掉\n
readlines
f = open('天下之主.txt', mode='r', encoding='gbk')
data_list = f.readlines()
f.close()
print(data_list)#['神秘主义\n', '哆啦\n', '圣者之心\n', '葫芦玩']
写
如果没有flush
语句的话,程序会把写的内容先存到缓冲区,等到不知道什么时候才会把缓冲区的内容刷到硬盘,flush
可以实现写一句刷一句
f = open('天下之主.txt', mode='a',encoding='gbk')
while True:
# 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。
f.write("哈哈哈哈")
f.flush()
f.close()
光标
seek
永远只移动到指定字节的位置
移动光标位置(字节)
注意:在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。
a模式在执行write时会先把光标移到最后再写数据
获取当前光标位置
f = open('天下之主.txt', mode='r', encoding='utf-8')
p1 = f.tell()
print(p1) # 0
f.read(3) # 读3个字符 3*3=9字节
p2 = f.tell()
print(p2) # 9
f.close()
上下文管理
之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。
以后再进行文件操作时,推荐大家使用with上下文管理,它可以自动实现关闭文件。
with open("xxxx.txt", mode='rb') as file_object:
data = file_object.read()
print(data)
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:
pass
文件修改
常见思路
- 文件读到内存,再通过replace(适用小文件,不适用大文件)
- 挨个位置读文件内容,遇到修改对象将其替换成新的文本内容(不可取)
-同时打开两个文件,读+写(适用大小文件)
with open("ha.conf","r",encoding="utf-8") as file2 ,\
open("ha.conf2","w",encoding="utf-8") as file3:
for line in file2:
newline=line.replace("哈哈哈","python")
file3.write(newline)
当然,如果想实现原文件的改写,也可以重命名
import shutil
shutil.move("ha.conf2","ha.conf")
这样"ha.conf"文件里的内容就是修改后的内容了