【Python知识点梳理】9.Python文件操作与模块

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中的模块、常用模块、制作、发布和安装模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器视觉小学徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值