Python文件操作与模块
1、文件打开、关闭、读写
在Python中操作文件的一般步骤:
1.打开文件
2.读/写文件
3.保存文件
4.关闭文件
在Python中打开文件使用open()函数,可以打开一个已经存在的文件,或者创建一个新文件。
语法格式:open(“文件名称”,“打开模式”) --> 文件名称:完整的路径。示例:
f = open("test.txt","w")
Popen()函数中的模式:
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
关闭文件:文件对象关闭,释放内存,如果不关闭,后面无法继续操作这个文件。
语法格式:close()。示例:
f.close()
with上下文管理:关闭文件句柄。with语句,不管在处理文件过程中是否发生异常,都能保证with语句执行完毕后关闭已经打开的文件句柄。示例:
def main():
with open("set.py", "w") as f:
content = f.read()
print(content)
main()
# 打开一个文件只用于写入。如果文件存在则将其覆盖,文件不存在,创建新文件
# 默认的编码是gbk编码模式,最好的习惯是在带开一个文件的时候就指定一个编码类型:encoding='utf-8'
f = open("Text_1.txt", "w", encoding='utf-8')
# 写 操作
f.write("我如果爱你——\n绝不像攀援的凌霄花,\n借你的高枝炫耀自己;")
# f.write("我如果爱你——") # 会覆盖掉之前的内容
# 关闭文件
f.close()
# 以二进制的形式去写数据(只与打开的模式有关:wb)
f = open("Text_2.txt", "wb") # str --> bytes
# 写 操作
f.write("我如果爱你——\n绝不像攀援的凌霄花,\n借你的高枝炫耀自己;".encode('utf-8'))
# 关闭文件
f.close()
# 以追加的形式去写数据(只与打开的模式有关:ab)
f = open("Text_2.txt", "ab") # str --> bytes
# 读/写 操作
f.write("\n".encode('utf-8'))
f.write("\n我如果爱你——\n绝不学痴情的鸟儿,\n为绿荫重复单调的歌曲;".encode('utf-8'))
# 关闭文件
f.close()
读取文件read(),将文件的内容全部读取出来。
1.读取指定字符个数:read(num)传入一个数字做参数,表示读取指定字符个数。
2.readlines()按行读取,一次性读取所有内容,返回一个列表,每一行内容作为一个元素。
# 读取文件
f = open("Text_3.txt", "a") # 默认的编码是gbk编码模式,在utf-8模式下会出现乱码
# 写 操作
f.write("我如果爱你——\n绝不像攀援的凌霄花,\n借你的高枝炫耀自己;\n")
f.write("我如果爱你——\n绝不学痴情的鸟儿,\n为绿荫重复单调的歌曲;\n")
f.write("也不止像泉源,\n常年送来清凉的慰藉;\n")
f.write("也不止像险峰,\n增加你的高度,衬托你的威仪。\n")
f.write("甚至日光,\n甚至春雨。\n")
# 关闭文件
f.close()
# 读数据操作:read()
f = open("Text_3.txt", "r")
print("-"*8, "第1次读取", "-"*8)
content = f.read(12) # 读取12个字符
print(content)
print("-"*8, "第2次读取", "-"*8)
content = f.read() # 第二次读取将从第一次读取的位置继续读取
print(content)
f.close() # 关闭文件
# 读数据操作:readline()读一行
f = open("Text_3.txt", "r")
print("-"*8, "第1次读取", "-"*8)
content = f.readline() # 读取一行
print(content)
print("-"*8, "第2次读取", "-"*8)
content = f.readline() # 第2次读取将从第1次读取的位置继续读取
print(content)
print("-"*8, "第3次读取", "-"*8)
content = f.readline() # 第3次读取将从第2次读取的位置继续读取
print(content)
f.close() # 关闭文件
# 读数据操作:readlines()一次性读取所有内容,返回一个列表,每一行内容作为一个元素。
f = open("Text_3.txt", "r")
content = f.readlines() # 读取一行
print(content)
print(len(content))
f.close() # 关闭文件
# 以二进制格式打开文件用于只读
f = open("Text_3.txt", "rb")
content = f.read() # 读取后显示二进制内容
print(content)
data = content.decode('gbk') # 读取字符串(解码)
print(data)
f.close()
# with上下文管理对象:自动释放打开的关联的对象
with open("Text_3.txt", "r") as f:
print(f.read())
2、应用:文件备份脚本
需求1:利用脚本完成自动备份,要求用户输入文件名称,完成自动备份。
def copyfile_1():
# 接收用户输入的文件名
old_file = input("请输入要备份的文件名:")
file_list = old_file.split(".") # 分割文件名和文件名的后缀
# 构造新的文件名,加上备份后缀
new_file = file_list[0] + "_备份." + file_list[1]
old_f = open(old_file, 'r') # 打开需要备份的文件
new_f = open(new_file, 'w') # 以写的模式打开新文件,不存在则创建
content = old_f.read() # 将文件内容读取出来
new_f.write(content) # 将文件内容写入备份文件
old_f.close() # 将打开的文件关闭
new_f.close()
copyfile_1()
需求2:处理超大文件。
def copyfile_2():
# 接收用户输入的文件名
old_file = input("请输入要备份的文件名:")
file_list = old_file.split(".") # 分割文件名和文件名的后缀
if len(file_list) < 2:
new_file = file_list[0] + "_备份"
else:
# 构造新的文件名,加上备份后缀
new_file = file_list[0] + "_备份." + file_list[1]
try:
# 同时打开需要备份的文件(监视要处理的逻辑)
with open(old_file, 'r') as old_f, open(new_file, 'w') as new_f:
while True:
content = old_f.read(1024) # 一次性读取1024个字符
new_f.write(content) # 将文件内容写入备份文件
if len(content) < 1024:
break
except Exception as msg:
print(msg)
copyfile_2()
3、文件定位
文件定位,指的是当前文件指针读取到的位置(光标位置)。
在读写文件的过程中,如果想知道当前的位置,可以使用tell()函数来获取。
f = open("Text_3.txt", "r")
content = f.read(3) # 读取前三个字符(中文字符是两个字符)
# 查看当前游标所在位置
cur = f.tell()
print(content)
print(cur)
content = f.read(3) # 读取前三个字符
# 查看当前游标所在位置
cur = f.tell()
print(content)
print(cur)
f.close()
truncate()方法用于截断文件,如果指定了可选参数size,则表示截断文件为size个字符,截断之后 size后面的所有字符被删除。
f = open("Text_3.txt", "r")
content = f.read()
print(content)
f.close()
# 在原文件上进行操作:保留前30个字符
d = open("Text_3.txt", "r+")
d.truncate(30)
content = d.read()
print(content)
d.close()
seek()方法用于移动文件读取指针到指定位置。seek(offset, from)有2个参数,offse:偏移量字节单位,负数是往回偏移,正数是往前偏移。from位置:0表示文件开头,1表示当前位置,2表示文件末尾。
f = open("Text_4.txt", "w")
f.write("My Name Is MACK, I Am Come Frome China")
f.close()
# 在文本文件中,如果没有使用二进制打开文件,只允许从文件的开头计算相对位置
with open("Text_4.txt", "rb") as f:
data = f.read(2)
print(data.decode("gbk"))
f.seek(2, 1)
data = f.read(5)
print(data.decode("gbk"))
f.seek(-6, 2)
data = f.read(4)
print(data.decode("gbk"))
4、模块导入方式介绍
Python有强大的第三方库,有很多常用功能,Python提供自带的内置模块。模块就是封装了一推函数的.py文件,就是一个工具包,有逻辑的组织代码,以库的方式封装功能,在程序需要的时候先将模块导入。
不同的模块可以定义相同的变量名,但是每个模块中的变量名的作用域只在本模块中。
分类:
1.内置模块
2.自定义模块
3.第三方模块
在Python中,导入模块使用import关键字。
1.import导入模块(导入所有的功能)
调用模块的格式:模块名.函数名,这样调用可以防止不同模块中有同名方法导致的错误。
a.首先会打开这个模块的文件;
b.然后执行模块中对于的文件,将执行过程中产生的名字都存入模块中的名称空间中;
c.在程序中会有一个模块的名称指向模块的名称空间。
搜索路径:
当解释器遇到import关键字,如果模块在当前的搜索路径中就会被导入。导入模块时会优先搜索当前目录下是否有这个名字的模块,所以在模块命名的时候不要与系统中的模块重名。
a.当前目录下;
b.如果当前目录没有,到环境变量中搜索,可以用sys模块中的path变量查看所有的路径(cmd命令行窗口:where python);
c.(Linux)如果都找不到,搜索默认路径(Linux系统:/usr/local/lib/python/)
d.(Windows)第三方模块的安装位置:在Python安装目录下的lib/site-packages/目录下。
# 导入模块
import time
# 调用模块中的函数:模块名.函数名
print(time.ctime())
import sys
print(sys.path)
2.from … import 导入模块
一个模块可能存在很多函数,如果只想导入其中的几个函数,可以使用from xxx import xxx,如果函数名相同,后面的导入会覆盖前面的导入,不用加前缀,代码简洁,但会与当前执行文件中名字空间中的名称起冲突。
a.首先会以这个模块为基础,创建一个模块的命名空间;
b.执行模块中对应的文件;
c.在当前模块的名称空间中得到一个名字,改名字直接指向模块中的一个名字,可以不用加前缀而直接使用。
from time import ctime, time
# from time import * # 把模块中的所有函数一次性全部导入
print(ctime())
print(time())
用as给模块取别名:在遇到导入模块名称很长,调用不方便,就可以使用as给模块取别名。
import time as myTime # 在程序中会用myTime指向模块的名称空间
print(myTime.ctime())
5、os模块操作文件
os模块概述:对文件进行重命名、删除等操作,os模块提供一些系统级别的指令操作。
# os模块常用方法
import os
# 1
os.rename("Text_3_备份.txt","Text_重命名.txt") # 修改文件名(需要修改的文件名,新的文件名)
os.remove("Text_删除.txt") # 删除文件(待删除的文件名),文件必须存在,否则报错
# 2
os.mkdir("Text_创建文件夹测试") # 创建文件夹(文件夹名称)
os.mkdir("E:/Text_创建文件夹测试") # 只能创建一级目录,不允许多级创建
os.makedirs("E:/Text_创建文件夹测试/1/2/3") # 创建多级目录
# 3
os.rmdir("Text_创建文件夹测试") # 删除文件夹(文件夹名称),只能删除空目录
import shutil # 删除非空目录需要shutil模块
shutil.rmtree("E:/Text_创建文件夹测试")
# 4
os.getcwd() # 获取当前目录
# 5
os.path.join(path1[, path2[, ...]]) # 路径拼接,将多个路径组合后返回
path = os.path.join(os.getcwd(), "vens")
print(path)
# 6
# 获取Python中的目录列表
paths = os.listdir("e:/")
for path in paths:
print(path)
# os.scandir和with一起使用,上下文管理器会在迭代器遍历完成后自动释放资源
with os.scandir("e:/") as paths: # 返回迭代器对象
for path in paths:
print(path.name)
# 7
# 判断文件或目录
basePath = "E:/Tensorflow2"
for path in os.listdir(basePath):
if os.path.isfile(os.path.join(basePath,path)): # 输出文件
print(path)
print("***"*16)
for path in os.listdir(basePath):
if os.path.isdir(os.path.join(basePath,path)): # 输出目录
print(path)
6、模块的制作、发布及安装
根据自己的需求,制作一个.py文件的模块。
# moudleTest.py
# 模块的制作说明
__all__ = [add, diff] # 如果存在__all__变量,对于from xxx import * 的情况只允许导入__all__中的元素
def add(x, y):
'''
普通的加法函数
'''
return x + y
def diff(x, y):
'''
普通的减法函数
'''
return x - y
def printInfo():
'''
普通的信息输出函数
'''
return '普通的信息输出函数'
# 测试
if __name__ == '__main__':
res = add(3, 5)
# print("测试模块的结果:%s" % res)
# print("模块__name__变量=%s" %__name__) # __main__
模块的调用:
# m_test.py
import moudleTest # 导入模块
# from moudleTest import add
# from moudleTest import *
res1 = moudleTest.add(3, 8)
print(res1)
res2 = moudleTest.printInfo()
print(res2)
发布模块:
1.将写好的包放在一个纯英文目录下文件夹中;
2.在这个目录下面创建一个setup.py文件。文件里写入下面的代码:
from distutils.core import setup
# name 模块名称
# version 版本
# description 描述
# author 作者
# py_modules 要发布的内容
setup(name="my_moudle", version="1.0", description=" 模块发布练习",
author="MyPort", py_modules=['moudleTest'])
3.创建模块。在模块文件所在目录中运行如下代码:
python setup.py build
4.压缩文件。在模块文件所在目录中运行如下代码,生成安装包文件:
python setup.py sdist
5.安装模块。xxx.tar.gz压缩包就可以通过pip进行安装(不必进行解压)。
pip install my_moudle-1.0.tar.gz
总结
Python文件操作与模块:文件操作是很常见的功能,Python自带文件的基本操作方法,可以借助os模块更加方便快捷。需要了解Python中的模块、常用模块、制作、发布和安装模块。