Python学习笔记6---文件与模块

一、文件操作

文件读写的几种方式
读:r r+ rb rb+
r 和 r+ 只读  适用于普通场景
rb 和 rb+ 适用于 文件、图片、视频、音频等文件读取

写:w w+ wb wb+ a ab
w wb w+ wb 每次都会创建文件
二进制读写时要注意编码问题,默认情况下我们写入的文件编码是gbk格式
a ab a+ 在原有的文件基础之后(文件的末尾)去追加,并不会创建新文件

1.1  打开文件open()、写入文件write()、关闭文件close()

打开文件,没有则新建,此函数返回文件句柄,‘w’表示写入。‘a’表示追加
# 打开文件     默认编码是GBK中文编码,最好的习惯是在打开文件是指定一个编码格式
obj=open('./Test.txt','w',encoding='utf-8')      #打开文件,没有则新建,此函数返回文件句柄
obj.write('若有人兮山之阿,')      #写入内容到文件
obj.write('被薜荔兮带女萝。\n')
obj.close()                     #关闭文件


#文件追加
obj=open('Test.txt','a',encoding='utf-8')
obj.write('既含睇兮又宜笑,')
obj.close()

代码执行后,文件相应的位置会出现《Test.txt》,文件里的内容为 下图

1.2 文件读取 read()、readline()、readlines()

with  ....as.... 会在文件使用结束后,自动释放打开的文件,防止内存泄露
with open('Test.txt','r',encoding='utf-8') as f:    #with  ....as.... 会自动释放打开的文件,防止内存泄露
    print(f.read(2))
    print(f.read(2))     #第二次调用read函数,会在第一次读取的光标之后读取
    print(f.readline())    #读取一行
    print(f.readlines())    #读取所有一行,返回时一个列表对象

需要说明的是:文件读取时起始光标为文件开头,以后每次读都是以上一次读取结束的位置作为起始位置。

1.3 小实验---文件备份

#文件备份
def CopyFile():
    old_flie=input('请输入要备份的文件名')
    file_list=old_flie.split('.') #split   过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串   ['Test', 'txt']
    print(file_list)
    #构造新的文件名 . 加上备份的后缀名
    new_file=file_list[0]+'_备份.'+file_list[1]
    print(new_file)
    old_f=open(old_flie,'r',encoding='utf-8')
    new_f=open(new_file,'w',encoding='utf-8')
    conten=old_f.read()
    new_f.write(conten)
    old_f.close()
    new_f.close()
    pass

CopyFile()
上面的代码 假如要备份的文件过大,读取大文件 则会导致内存被占用。一下是改良版本
#上面的代码 假如读取大文件 则会导致内存被占用
def CopyFile():
    old_flie=input('请输入要备份的文件名')
    file_list=old_flie.split('.') #split   过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串   ['Test', 'txt']
    print(file_list)
    #构造新的文件名 . 加上备份的后缀名
    new_file=file_list[0]+'_备份.'+file_list[1]
    print(new_file)
    try:
        with open(old_flie,'r',encoding='utf-8') as old_f,open(new_file,'w',encoding='utf-8') as  new_f:
            while True:
                conten=old_f.read(1024)     #设置每次读取1k个字符
                new_f.write(conten)         #写入到新文件
                if len(conten)<1024:        #如果本次读取的字符 小于1k ,跳出循环
                    break
                    pass
                pass
    except Exception as msg:
        print(msg)
    pass

CopyFile()

1.4 文件定位相关函数

tell()  ------------返回当前文件读取到的位置
truncate() --------可对源文件进行截取操作 保留前15个字符 会修改源文件
seek()-------------跳转到文件的指定位置seek

.....

#文件定位
#读文件
with open('Test.txt','r+',encoding='utf-8') as f:    #with  ....as.... 会自动释放打开的文件,防止内存泄露
    print(f.tell())      #返回当前文件读取到的位置
    print(f.read(2))
    print(f.read(2))   #第二次调用read函数,会在第一次读取的光标之后读取
    print(f.tell())
    print(f.readline())    #读取一行
    print(f.readlines())    #读取所有一行,返回时一个列表对象

    print(f.read())
    f.truncate(15)              #可对源文件进行截取操作 保留前15个字符 会修改源文件
    print(f.read().encode('gbk'))
    print(f.tell())  # 第二次调用read函数,会在第一次读取的光标之后读取
    f.seek(-2,2)
    print(f.tell())  # 第二次调用read函数,会在第一次读取的光标之后读取
#跳转到文件的指定位置seek

 

二、模块操作

  模块导入时发生以下 3步操作
 1、打开模块文件
 2、执行模块对应的文件,将执行过程产生的名字丢到模块的名称空间
 3、程序中调用时,指向对应的文件的相应位置

2.1 导入模块

导入模块的三种形式:

import time   #导入时间模块
print(time.ctime())  #调用时间模块

from time import ctime,time
print(ctime())

#from time import *

假如模块内部有    “__all__” 的方法那么  在使用from xxx import 导入时 只有all指定可以被外部调用的函数。例如那么假如外部文件使用 from xxx import 加载这个文件,只能加载到add_test一个函数。

__all__=['add_test']     #在使用from xxx import  导入时    只有all指定可以被外部调用的函数

def add_test(x,y):
    return x+y


if __name__ == '__main__':    #表示 只有在当前文件执行
    print('模块测试,%s'%add_test(1,5))
    pass
if __name__ == '__main__':    #表示 只有在当前文件执行
 

2.2 系统操作

使用Python操作Windows系统的相关内容 

import os
import shutil
os.rename('Test_备份.txt','测试.txt')            #重命名 《Test_备份.txt》文件为《测试.txt》前提是文件必须存在
os.remove('test.py')                           # 删除文件《test.py》  前提是文件必须存在
os.mkdir('python')                              #创建文件件    只能创建一层文件
os.rmdir('python')                              #删除文件夹      只能删除空目录
os.makedirs('d:/Pthon/a/b')                     #创建文件夹多级文件夹
shutil.rmtree('d:/Pthon/a/b')                   #删除全部文件夹  包含子文件

print(os.getcwd())                             #获取当前所在路径
print(os.path)
print(os.getcwd().join(),'venv')               #路径拼接

举例:文件遍历

#遍历文件方法1
lis=os.listdir('D:/')                           #获取D盘的文件列表
print(lis)

#遍历文件方法2
with os.scandir('d:/') as i:
    for j in  i:
        print(j.name)
        pass

2.3 模块制作

  • 在python中一个.py文件就是一个模块
    不同的模块可以定义相同的变量名、函数名,但只应用于本模块中
    模块分为  : 内置模块   第三方模块   自定义模块

2.3.1    模块制作步骤1--在当前工程下创建文件夹mod

2.3.2     写入一个固定格式的文件setup

from distutils.core import setup
#name 模块名称
#version  版本号
#description    描述
#author    作者
#py_modules    要发布的内容

setup(name='add',version='1.0',description='test',author='zxl',py_modules=['add'])

2.3.3   创建 和  压缩

使用Windows命令行进入当前创建的文件夹目录下执行如下操作

猜你喜欢

转载自blog.csdn.net/qq_34301282/article/details/111833346