Python文件与IO

1.文件与IO

  • 变量、序列和对象中储存数据是暂时的,程序结束后就会丢失,为长时间保存程序中的数据,需要将程序中的数据保存到磁盘文件中。
  • Python提供内置文件对象和文件、目录进行操作的内置模块,通过这些技术可以很方便将数据保存到文件中,达到长时间保存数据的目的。

2.文件基本操作

  • Python中内置文件(File)对象,通过内置open()方法创建打开文件对象,然后通过该对象提供的方法进行一些基本文件操作

2.1 创建和打开文件

  • Python中想操作文件需要先创建或打开指定的文件并创建文件对象,通过内置open()函数实现。
open()语法:
file = open(filename[,mode[,buffering]])

参数说明:
file:被创建的文件对象
filename:要创建或打开文件名称,需要使用单引号或双引号括起来,如打开文件与当前目录在同目录,直接写文件名字即可,否则需要写完整路径
mode:可选参数,指定文件打开模式如下图
buffering:用于指定读写文件的缓冲模式,值为0表示表达式不缓存;值为1表达表达式缓存;大于1,表示缓冲区大小,默认缓存模式

在这里插入图片描述

# 创建文件,正常情况open()打开不存在文件会报错
# 指定mode的参数值为w,w+,a,a+,打开文件不存在,自动创建新的文件
file = open('yxy.txt','w')

# 文件打开,前提文件已经创建,如没有会报错
file1 = open('yxy.txt','r')
print(file1)
'''
输出:<_io.TextIOWrapper name='yxy.txt' mode='r' encoding='cp936'>
CP936其实就是GBK,IBM在发明Code Page的时候将GBK放在第936页,所以叫CP936
'''

# 打开指定编码文件,默认采用GBK编码,如果被打开不是GBK,抛出异常
# 方法一:直接修改文件编码
# 方法二:open()打开文件指定编码格式,推荐使用
file3 = open('yy.txt','w',encoding='utf-8')
print(file3)
'''
输出:<_io.TextIOWrapper name='yy.txt' mode='w' encoding='utf-8'>
'''

2.2 关闭文件

  • 打开文件需及时关闭,以免对文件造成不必要破坏,关闭文件使用close()方法实现
  • close()方法先刷新缓冲区还没有写入的信息,然后在关闭文件、这样可以将没有写入到文件的内容写入到文件中。关闭文件后,不能在进行写入操作。
# file.closed 查看文件打开关闭状态,为关闭显示False,关闭显示True
file4 = open('message.txt','w',encoding='utf-8')            # 创建打开文件
print('关闭前',file4.closed)                                # 输出:False
file4.close()                                               # 关闭文件
print('关闭后',file4.closed)                                 # 输出:True

# 文件读写时有可能产生IOError,一旦出错,file4.close()就不会调用
# 保障无论是否出错都能正确关闭文件,可以使用try-finally实现
try:
    file4 = open('message.txt', 'r', encoding='utf-8')
    print(file4)
    '''
    <_io.TextIOWrapper name='message.txt' mode='r' encoding='utf-8'>
    '''
    print('关闭前', file4.closed)                          # 输出:关闭前 False
finally:
    file4.close()
    print('关闭后', file4.closed)                          # 输出:关闭后 True

2.3 使用with语句打开文件

  • 打开文件,即使关闭,忘记关闭可能带来意想不到的问题。Python提供with语句,实现文件处理,是否抛出异常,保证with语句执行完毕后关闭已经打开文件
with基本语法: 
with expression as target:
      with-body

参数说明:
expression:指定表达式,打开文件open()函数
target:指定变量,将expression结果保存到该变量中
with-body:指定with语句体,直接使用pass语句代替
with open('yxy.txt','r') as wfile:
    print(wfile.closed)                      # 输出:False
print(wfile.closed)                          # 输出:True

2.4 读取文件

  • Python打开文件后,可以写入追加内容,还可以读取文件内容
read()语法:
file.read([size]) 说明:file打开文件对象;size可选参数指定读取字符个数,省略一次读取所内容

注意:调用read()方法读取内容前提,打开文件指定打开模式为r(只读)或r+(读写)否则会抛出异常
''io.UnsupportedOperation: not readable''
# yxy.txt文件内容
'''
11111111
22222222
33333333
44444444
'''
with open('yxy.txt','r') as wfile:
    string = wfile.read()
print(string)
'''
输出:
11111111
22222222
33333333
44444444
'''

# 读取一行
with open('yxy.txt','r') as wfile:
    str = wfile.readline()
    print(str)
'''
输出:11111111
'''

# 读取所有
with open('yxy.txt','r') as wfile:
    str1 = wfile.readlines()
    print(str1)
'''
输出:['11111111\n', '22222222\n', '33333333\n', '44444444']
'''

# 运行可以看到readlines()返回是一个字符串,如果文件较大,采用这中方法输出会很慢,
# 可以将列表内容逐行输出
with open('yxy.txt','r') as wfile:
    str1 = wfile.readlines()
    for message in str1:
        print(message.rstrip())     # 自带换行符 在换行 两个换行符 使用rstrip()删掉最右侧一个换行符
'''
输出:
11111111
22222222
33333333
44444444
'''

2.5 文件写入

  • 调用write()方法向文件写入内容前提,打开文件时,指定的打开模式为w(可写),或者a(追加),否则会抛出io.UnsupportedOperation: not writable
  • w模式打开文件会覆盖前面文件,慎用,建议使用a(追加方式打开写入文件),文件末尾写入文件
with open('3.txt','a',encoding='utf-8') as fp:
    # 只能写入一个字符串
    # fp.write("333")
    # 把列表元素(必须是字符串)写入文件
    data = ['111','222','333','444']
    # 添加换行符
    data = [line+'\n' for line in data]
    fp.writelines(data)
    # 刷新缓冲区【加速数据的流动,保证缓冲区的流畅】
    # close()关闭文件也会刷新缓冲区
    fp.flush()

2.6 移动文件指针

file.seek(offset[,whence])

注意:使用seek()方法时,offfset的值按照一个汉字占两个字符,英文和数字占一个字符计算
参数说明:

file:表示已经打开的文件对象
offset:用于指针移动的字符个数,其具体位置与whence有关
whence:文件指针的位置,可以参数,值可以是
SEEK_SET or 0 表示文件开头位置,默认值
SEEK_CUR or 1 表示当前位置(不能使用)
SEEK_END or 2 表示末尾位置(不能使用)
# 1.txt内容:hello world
with open('1.txt','r',encoding='utf-8') as fp:
    # 移动到hello后的空格位置
    fp.seek(5)
    print(fp.read(3))    # 输出:wo
    # 移动到开头
    fp.seek(0)
    print(fp.read(5))    # 输出:Hello
    # 显示当前指针位置
    print(fp.tell())     # 输出5

3.目录操作

  • 目录称为文件夹,用于分层保存文件,通过目录可以分门别类地存放文件
  • os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,不同操作系统上运行,可能会的到不一样的结果
  • 常用的目录操作主要有判断目录是否存在、创建目录、删除目录和遍历目录等

3.1 os和os.path模块

  • Python中,内置os模块及其子模块os.path,对目录或文件进行操作,导入os模块也可以使用子模块os.path
import os

# 获取操作系统类型 ,nt表示Windows操作系统,
# posix表示linux、Unix或Mac OS操作系统
print(os.name)       # 输出:nt

# 获取当前系统换行符
print(os.linesep)    # 输出:'\r\n' PyCharm貌似不显示,自动换行了

# 获取操作系统使用路径分隔符
print(os.sep)        # 输出:\

3.2 路径

  • 定位一个文件或目录的字符串称为一个路径。程序开发,设计两种路径:一种是相对路径,另一种绝对路径

3.2.1 相对路径

  • 工作路径:指当前二五年间所在的目录。Python中,通过os模块提供getcwd()函数获取当前工作目录
  • Python中,指定文件路径需要对巨鲸分隔符"“进行转移,即路径中’’’‘替换为’’\’‘,另外也可以将路径分隔’’’‘采用’’/’'代替,或者在路径字符串前加字母r(或R),表示路径中分隔符不需要转义可以直接使用”"
import os
print(os.getcwd())   # 输出:E:\千锋教育\第24天_文件和目录\代码 
相对路径就是依赖于当前工作目录,如在当前工作目录下,有一个名称为yxy.txt的文件,打开这个文件可以直接写文件名,如果在当前工作目录下,
有一个子目录demo,并在该目录保存文件yxy.txt,那么打开这个文件写上''demo/yxy.txt''
# 直接打开yxy.txt文件
with open('yxy.txt','r') as rfile:
	pass

# 打开相对路径demo/yxy.txt文件
with open("demo/yxy.txt",'r') as rfile:
    pass

# 使用r打开相对路径
with open(r"demo\yxy.txt",'r') as rfile:
    pass

3.2.2 绝对路径

绝对路径:文件的实际路径,不依赖当前工作目录

os.path.abspath(path)
# 获取绝对路径
import os
print(os.path.abspath(r"yxy.txt"))        
'''
输出:E:\千锋教育\第24天_文件和目录\代码\yxy.txt
'''

3.3.3 拼接路径

  • 想将两个或多个路路径拼接到一起组成一个新路径,使用os.path模块提供join()函数实现
  • 使用os.path.join()函数拼接路径,并不会检测该路径是否真实存在
os.path.join(path1[,path2[,......]])
# 拼接路径
import os
print(os.path.join(r"E:\千锋教育\第24天_文件和目录\代码",r"demo\message.txt"))
'''
输出:E:\千锋教育\第24天_文件和目录\代码\demo\message.txt
注意:该路径目录并不存在
'''
# 使用join()函数,要拼接路径,存在多个绝对路径,从左到右顺序最后一次出现为准,该路径之前参数都会被忽略
print(os.path.join(r'E:\code',r'C:\\','demo'))    # 输出:C:\\demo

3.4 判断目录是否存在

  • Python中,有时候需要判断给定的目录是否存在,使用os.path模块提供的exists()函数实现
os.path.exists(path)

参数说明:
path:为要判断的目录,可以采用相对路径,也可以采用绝对路径
返回值:目录存在返回True,不存在返回False
import os
print(os.path.exists(r'E:\千锋教育\第24天_文件和目录\代码\demo\message.txt'))  # 输出:False
print(os.path.exists(r'E:\千锋教育\第24天_文件和目录\代码'))                   # 输出:True

3.5 创建目录

  • Python中,os模块提供了两个创建目录的函数,一个用于创建一级目录;另一个创建多级目录

3.4.1 创建一级目录

  • 一次只能创建一级目录,使用os模块提供mkdir()函数实现
  • 只能指定创建最后一级目录,如果上一级目录不存在,抛出FileNotFoundError异常
os.mkdir(path,mode=0o777)

参数说明:
path:指定创建的目录,可以使用绝对路径,也可以使用相对路径
mode:指定数值模式,默认值0777,该参数在非UNIX系统上无效或被忽略
# 创建E:\demo目录
import os
if os.path.exists(r'E:\demo') == True:
    '''创建目录存在,执行mkdir命令会抛出FileExistsError异常'''
    pass
else:
    print('E:\demo没有存在已创建')
    os.mkdir(r'E:\demo')

3.4.2 创建多级目录

  • 创建多级目录,使用os模块提供makedirs()函数,该函数采用递归方式创建目录
os.makedirs(name,mode=0o777)
# 创建创建E:\demo\1\2\3\4目录
import os
path = r'E:\demo\1\2\3\4'          # 指定创建目录
if not os.path.exists(path):       # 判断目录是否存在
    os.makedirs(path)              # 创建目录
    print('目录创建成功')
else:
    print('该目录已存在')

3.6 删除目录

  • 删除目录使用os模块提供rmdir()函数实现
  • 通过rmdir()函数删除目录时,只有当要删除目录为空才起作用
 os.rmdir(path)

# 删除E:\demo\1\2\3目录下的4目录
# 再次运行抛出异常:FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'E:\\demo\\1\\2\\3\\4'
# 说明该目录已经删除,只能删除空列表
import os
os.rmdir(r'E:\demo\1\2\3\4')
  • 使用rmdir()函数只能删除空的目录,如果想要删除非空目录,需要使用Python内置的保准模块shutil的rmtree()函数实现
import shutil
shutil.rmtree(r'E:\demo')     # 删除demo及下面目录及其内容

3.7 遍历目录

  • Python中对指定目录下的全部目录(包括子目录)及文件浏览一遍
  • Python中,os模块中walk()函数用于实现遍历目录的功能
os.walk(top[,topdown][,onerror][,followlinks])

参数说明:
top:指定要遍历内容的根目录
topdown:可选参数,用于指定遍历顺序,如果值为True,表示自上而下遍历(即先遍历根目录);
         如果值为False,表示自下而上遍历(即先遍历最后一级子目录),默认值为True
onerror:可选参数,指定错误处理方式,默认忽略,如果不想忽略也可以指定一个错误处理函数,通常情况下默认
followlinks:可选参数,默认情况下,walk()函数不会向下转换成解析到目录的符号链接,
             将该参数值设置为True,表示用于指定在支持系统上访问由符号链接指定的目录
返回值:返回3个元素(dirpaht,dirnames,filenames)元组组成的生成器对象;
       dirpath:表示当前遍历路径,是一个字符串
       dirnames:表示当前路径下的包含的子目录是一个列表;
       filenames:表示当前路径下包含的文件也是一个列
# 遍历E盘所有文件目录
import  os

p = r'E:\\'
print('[',p,']目录下包含的文件和目录')
for root,dirs,files in os.walk(p,topdown = True):         # root根目录 dirs路径 filesw文件 遍历指定目录从哈桑倒下
    for name in dirs:
        print(os.path.join(root,name))
    for name in files:
        print('\t',os.path.join(root,name))
'''
输出:
E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\refs
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\COMMIT_EDITMSG
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\config
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\description
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\HEAD
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\index
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\hooks\applypatch-msg.sample
	 ...
'''

4.高级文件操作

  • Python内置os模块除了可以对目录进行操作,还可以对文件进行一些高级操作,具体如下
    在这里插入图片描述

4.1 删除文件

  • Python没有内置删除文件函数,在内置os模块中提供了删除文件函数remove()
os.remove(path)
# 删除yxy.txt,删除不存在文件抛出异常
# FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'yxy.txt'
import os
os.remove('yxy.txt')

4.2 重命名文件和目录

  • os模块提供重命名文件和目录的函数rename(),如果指定的时路径文件,则重命名文件;如果指定的路径目录,则重命名目录
os.rename(src,dst)
# 重名名文件于目录一样
import os

src = r'E:\千锋教育\第24天_文件和目录\代码\1.txt'   # 要重名的文件
dst = r'E:\千锋教育\第24天_文件和目录\代码\2.txt'   # 重命名后的文件
if os.path.exists(src):                           # 判断文件是否存在
    os.rename(src,dst)                            # 从命名
    print('文件重命名完毕!')
else:
    print('文件不存在')

4.3 获取文件基本信息

  • 计算机创建文件后,该文件本身会包含一些信息,通过os模块stat()函数可以获取到文件这些基本信息
os.stat(path)

在这里插入图片描述

import os                                        # 导入os模块
if os.path.exists('2.txt'):                      # 判断文件是否存在
    fileinfo = os.stat('2.txt')                  # 获取文件的基本信息
    print('文件完整路径',os.path.abspath('2.txt'))# 获取文件的完整路径
    print('文件大小:',fileinfo.st_size,"字节")   # 输出文件基本信息
    print('最后一次修改时间',fileinfo.st_mtime)
'''
输出:
文件完整路径 E:\千锋教育\第24天_文件和目录\代码\2.txt
文件大小: 11 字节
最后一次修改时间 1584004049.6943874
'''
发布了21 篇原创文章 · 获赞 3 · 访问量 2129

猜你喜欢

转载自blog.csdn.net/Sky_Mazarine/article/details/104819308
今日推荐