文件与IO

创建和打开文件

1.通过python内置的open()函数可以创建和打开文件。

语法

file = open(filename[,mode[,buffering]])
'''
file:创建的文件对象
mode:可选参数,指定文件的打开模式。默认为只读r
注意:mode推荐使用w、w+、a、a+,这样文件不存在时可以创建新文件,避免文件不存在而报错
'''

mode参数值附表

案例

#如果文件不存在需要手动创建文件,否则会报错
file = open('a.txt','r')

#w,如果文件不存在则创建文件并写入文件
file = open('a.txt','w')

2.打开文件时指定编码方式
python默认是以gbk编码读取文件内容的,如果文件内容是UTF-8,需要这样写

file = open('message.txt', 'r',encoding="utf-8")
print(file.read())

3.以二进制打开文件
一般为图片,音频,视频文件

#以二进制打开文件
file = open('tu.jpg', 'rb')
print(file)#out:<_io.BufferedReader name='tu.jpg'>
#创建的是一个BufferedReader对象,这个对象可以交由其他模块处理,而已调整图片大小等。

关闭文件

1.使用file.close()方法关闭文件

案例

file = open('a.txt', 'r',encoding='utf-8')
print(file.read())
print('关闭前:',file.closed) #使用file.closed属性查看文件是否关闭
file.close()
print('关闭后:',file.closed)
'''
相信自己
关闭前: False
关闭后: True
'''

2.使用with语句关闭文件
使用with语句可让python自动检查并关闭不再使用的文件。

案例

with open('a.txt', 'r',encoding='utf-8') as file:
    pass
print('文件是否已关闭:',file.closed)
'''
文件是否已关闭: True
'''

读取文件

1.从头开始读取指定字符
可使用file.read()方法。
注意:每一个汉字,字母,数字都占一个字符。

案例

#读取前3个字符
with open('message.txt','r',encoding='utf-8') as file:
    string = file.read(3)
    print(string) #out:刘亦菲

2.读取指定位置开始的字符
可使用file.seek()方法将文件指针移动到指定位置再使用file.read()方法读取字符。

语法

file.seek(offset[,whence])
'''
offset:表示文件指针移动位置,默认从0开始。注意英文字母、数字占一个字符,gbk编码占两个字符,utf-8一个汉字占三个字符
whence:值为0表示从文件头开始计算,值1从当前位置开始计算,值2从文件尾开始计算,默认为0
'''

案例

#取出message.txt文件中'你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料!进食速度大大加快。'中的小鸡
#因为文件使用的是utf-8编码,汉字占3个字符,小鸡位于10*3=30
with open('message.txt','r',encoding='utf-8') as file:
    file.seek(30) #使光标移动到30个字符位置
    string = file.read(2) #读取2个字符
    print(string) #out:小鸡

3.按行读取数据
可使用file.readline()实现。
当文件很大时,一次性读取到内存中可能会很卡,这时可以用到这种方法。

案例

with open('message.txt','r',encoding='utf-8') as file:
    number = 0 #定义行号
    while True:
        number += 1
        line = file.readline()
        if line == '':#读取到末位即为空时跳出循环
            break
        print(number,line,end = '')

4.读取全部行
使用file.readlines()方法。
注意:返回的是字符串的列表

案例

with open('message.txt','r',encoding='utf-8') as file:
    message = file.readlines()
print(message)
#out: ['我是第一行内容\n', '我是第二行内容\n', '我是第三行内容\n', '我是第四行内容\n', '我是第五行内容\n']

#使用for逐行输出
with open('message.txt','r',encoding='utf-8') as file:
    message1 = file.readlines()
    for message in message1:
        print(message,end='')
'''
out:
我是第一行内容
我是第二行内容
我是第三行内容
我是第四行内容
我是第五行内容
'''

写入文件内容

可通过write()方法写入文件。

案例

#方式一
with open('a.txt', 'w',encoding='utf-8') as file:
    file.write('相信自己!')

#方式二
file = open('a.txt', 'w',encoding='utf-8')
file.write('相信自己!') #此时打开文件是没有内容的,文件还在缓冲区中,需要关闭才可写入
file.close() #或者使用 file.flush()输出缓冲区内容到文件

#a追加写入
file = open('message.txt', 'a',encoding='utf-8') #a表示追加模式
file.write('你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料!进食速度大大加快。\n')
print('写入了一条动态!')
file.close()

#将列表写入文件
list1 = ['刘亦菲','景甜','娜扎','文咏珊']
with open('message.txt','w',encoding='utf-8') as file:
    file.writelines(list1)
    #使用列表推导式,给每个名字后加一个换行符
    file.writelines([line + '\n' for line in list1])

目录操作

目录也叫文件夹,用来分门别类保存文件。
使用python内置的os模块以及子模块os.path可以用来对目录进行相关操作。

案例

#使用模块提供的通用变量获取与系统有关的信息
#在Python自带ide中使用
>>> import os
>>> os.name #windows显示nt,Linux或Mac OS显示为posix
nt
>>> os.linesep #输出当前系统换行符
'\r\n'
>>> os.sep #输出当前系统使用的路径分隔符
'\\'

路径

1.相对路径
使用os.getcwd()获取当前工作目录。

语法

#输出当前工作路径
import os
print(os.getcwd())#out:E:\python

案例

#使用相对路径打开文件
#使用\\分隔符
with open('code\\message.txt',encoding='utf-8') as file:
    print(file.read()) #执行成功
#或/
with open('code/message.txt',encoding='utf-8') as file:
    print(file.read())
#或r,将该字符串原样输出,\就不需要再转义了
with open(r'code\test.txt',encoding='utf-8') as file:
    print(file.read())

2.绝对路径
使用os.path.abspath()获取文件的绝对路径。

案例

import os
print(os.path.abspath(r'code\message.txt'))
#out:E:\python\code\message.txt

3.拼接路径
将多个路径拼接成一个新路径可以使用os.path.join()函数实现。

语法

os.path.join(path1[,path2[,...]])
#[]表示可选参数,逗号表示以逗号分隔。

案例

import os
print(os.path.join(r'E:\python',r'code\message.txt'))
#out:E:\python\code\message.txt

#如果路径中没有绝对路径,则拼接后的路径为相对路径。
import os
print(os.path.join(r'python',r'code\message.txt'))
#out:python\code\message.txt

#如果在拼接过程中出现多个绝对路径以最后一次出现的为准
import os
print(os.path.join(r'E:\python',r'C:\python',r'code\message.txt'))
#out:C:\python\code\message.txt

判断目录是否存在

使用os.path.exists()函数实现。
注意:不区分目录名或文件名大小写,返回值为布尔值类型,可用来判断文件跟目录是否存在。

案例

#判断目录是否存在
import os
print(os.path.exists(r'D:\demo')) #out:False

#判断文件是否存在
import os
print(os.path.exists(r'E:\pytHon\message.txt')) #out:True

创建目录

通过os.mkdir()函数创建。
注意:如果创建目录存在则会报错,需要if语句判断目录是否存在。

案例

import os
os.mkdir('E:\\demo') #创建目录,如果目录存在则会报错

#if判断目录是否存在
import os
if not os.path.exists('D:\\demo'):
    os.mkdir('D:\\demo')
    print('创建成功!')
else:
    print('该目录已存在!')

#自定义函数创建多级目录
import os
def mkdir(path):
    if not os.path.isdir(path): #判断是否为一个目录
        mkdir(os.path.split(path)[0])
    else:
        return
    os.mkdir(path)
mkdir('D:\\demo\\test\\code')

#使用makedirs()创建多级目录
import os
os.makedirs(r'D:\demo\test\code')

删除目录

使用os.rmdir()函数
注意:如果目录不存在就会报错;删除的目录不为空时也会报错。

案例

import os
os.rmdir(r'D:\demo\test\code') #删除了code目录

#加if判断目录是否存在
import os
if os.path.exists(r'D:\demo\test\code'):
    os.rmdir(r'D:\demo\test\code') #删除code目录
    print('目录删除成功!')
else:
    print('目录不存在!')

#删除不为空的目录
import os,shutil
if os.path.exists(r'D:\demo\test\code'):
    shutil.rmtree(r'D:\demo\test\code') #删除code目录
    print('目录删除成功!')
else:
    print('目录不存在!')

遍历目录

使用os.walk()函数实现。

语法

os.walk(top[,topdown][,onerror][,followlinks])
'''
top:要遍历的目录
topdown:可选参数,True自上而下遍历先遍历根目录,False先遍历子目录,默认True。
onerror:可选参数,指定一个处理错误的函数,默认忽略。
followlinks:可选参数,True指定在支持的系统上访问由符号连接指向的目录,相当于windows的快捷方式,默认False。
'''

案例

import os
path = os.walk(r'D:\python')
for p in path:
    print(p)
'''
out:
('D:\\python', ['demo'], ['demo.py', 'message.txt', 'picture.bmp']) #python目录下含有demo文件夹以及3个文件
('D:\\python\\demo', [], ['status.txt', 'test.txt']) #demo目录下没有文件夹,但有两个文件。
'''

#遍历指定目录
import os
path = r'D:\python'
print(path,'目录包含以下文件或目录:')
for root,dirs,files in os.walk(path,topdown = True):
    for name in dirs:
        print(os.path.join(root,name))
    for name in files:
        print('\t',os.path.join(root,name))
'''
out:
D:\python 目录包含以下文件或目录:
D:\python\demo
	 D:\python\demo.py
	 D:\python\message.txt
	 D:\python\picture.bmp
	 D:\python\demo\status.txt
	 D:\python\demo\test.txt
'''

删除文件

使用os.remove()函数实现。
注意:如果要删除的文件不存在会报错。

案例

import os
os.remove(r'D:\python\demo\test.txt')

#使用if语句判断要删除的文件是否存在
import os
if os.path.exists(r'E:\python\demo\test.txt'):
    os.remove(r"E:\python\demo\test.txt")
else:
    print('文件不存在!')

重命名文件和目录

使用os.rename()函数。
注意:如果要重命名的文件不存在也会报错。

案例

import os
scr = r'D:\python\message.txt'
dst = r'D:\python\test.txt'
os.rename(scr,dst)

#添加if语句判断文件是否存在
import os
scr = r'D:\python\message.txt'
dst = r'D:\python\test.txt'
if os.path.exists(scr):
    os.rename(scr,dst)
else:
    print('文件不存在!')

#修改目录方法同上

获取文件基本信息

os.stat()函数获取文件基本信息。
注意:返回值是一个对象,对象包含以下属性。

附表

案例

import os
fileinfo = os.stat('tu.jpg') #获取文件基本信息
print('文件完整路径:',os.path.abspath('tu.jpg'))
print('索引号:',fileinfo.st_ino)
print('设备名:',fileinfo.st_dev)
print('文件大小:',fileinfo.st_size) #默认以字节显示
print('最后一次访问时间:',fileinfo.st_atime)
print('最后一次修改时间:',fileinfo.st_mtime)
print('最后一次状态变化时间:',fileinfo.st_ctime)
'''
out:
文件完整路径: E:\python\tu.jpg
索引号: 5066549580796826
设备名: 3729639923
文件大小: 13884
最后一次访问时间: 1606460381.9726162
最后一次修改时间: 1606452121.2084086
最后一次状态变化时间: 1606460381.9726162
'''

#定义格式化时间,文件大小函数
import os
import time
def formatTime(longtime):
    '''格式化时间函数'''
    return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(longtime))

def formatByte(number):
    '''格式化文件大小函数'''
    for (scale,label) in [(1024*1024*1024,'GB'),(1024*1024,'MB'),(1024,'KB')]:
        if number >= scale:
            return '%.2f %s' %(number*1.0/scale,label)
        elif number == 1:
            return '1byte'
        else:
            byte = '%.2f' %(number or 0)
    return (byte[:-3] if byte.endswith('.00') else byte) + 'byte' #判断byte是否以.00结尾,如果不是则返回倒数3位,否则返回0

fileinfo = os.stat('tu.jpg') #获取文件基本信息
print('文件完整路径:',os.path.abspath('tu.jpg'))
print('索引号:',fileinfo.st_ino)
print('设备名:',fileinfo.st_dev)
print('文件大小:',formatByte(fileinfo.st_size)) #默认以字节显示
print('最后一次访问时间:',formatTime(fileinfo.st_atime))
print('最后一次修改时间:',formatTime(fileinfo.st_mtime))
print('最后一次状态变化时间:',formatTime(fileinfo.st_ctime))
'''
out:
文件完整路径: E:\python\tu.jpg
索引号: 5066549580796826
设备名: 3729639923
文件大小: 13.56 KB
最后一次访问时间: 2020-11-27 14:59:41
最后一次修改时间: 2020-11-27 12:42:01
最后一次状态变化时间: 2020-11-27 14:59:41
'''

附表

mode参数值附表


学习来自:《python从入门到项目实践》明日科技 第十四章(视频)
posted @ 2020-11-29 23:07  努力吧阿团  阅读(62)  评论(0编辑  收藏  举报