Python练习task7:文件与文件系统

打开文件

在python中用open(file,mode=‘r’)打开文件,它接收两个参数:文件名(file)和模式(mode),用于打开一个文件,并返回文件对象,如果该文件无法被打开,会抛出OSError。
在这里插入图片描述
完整的语法格式
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None)
file:必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符

f=open('python.txt','r', encoding='UTF-8')
print(f)
for each in f:
    print(each)

在这里插入图片描述

文件对象方法

fileObject.close() 用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发ValueError错误。

f=open('python.txt','r', encoding='UTF-8')
print(f.name)
f.close()
#python.txt

fileObject.read([size]) 用于从文件读取指定的字符数,如果未给定或为负则读取所有。

f=open('python.txt','r', encoding='UTF-8')
print(f.read(10))
#君不见,黄河之水天上

fileObject.readline()读取整行,包括 “\n” 字符。

f=open('python.txt','r', encoding='UTF-8')
print(f.readline())
#君不见,黄河之水天上来,奔流到海不复回。

fileObject.readlines()用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。

f=open('python.txt','r', encoding='UTF-8')
lines = f.readlines()
print(lines)
for each in lines:
    each.strip()
    print(each)

在这里插入图片描述
fileObject.tell()返回文件的当前位置,即文件指针当前位置。

f = open('python.txt', 'r',encoding='UTF-8')
line = f.readline()
print(line)
pos = f.tell()
print(pos)
f.close()
#君不见,黄河之水天上来,奔流到海不复回。
#62

fileObject.seek(offset[, whence])用于移动文件读取指针到指定位置。
offset:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。

f=open('python.txt','r',encoding='UTF-8')
line = f.readline()
print(line)
line = f.readline()
print(line)
f.seek(0, 0)
line = f.readline()
print(line)
f.close()

在这里插入图片描述
fileObject.write(str)用于向文件中写入指定字符串,返回的是写入的字符长度

f=open('python.txt','wb+')
print(f.write(b'0123456789abcdef'))
print(f.seek(5))
print(f.read(1)) 
print(f.seek(-3, 2))
print(f.read(1))

在这里插入图片描述
在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。如果文件打开模式带b,那写入文件内容时,str(参数)要用encode方法转为bytes形式,否则报错:TypeError: a bytes-like object is required, not ‘str’。
fileObject.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符\n。

f=open('python.txt','w+')
seq = ['zjl\n', '1028']
f.writelines(seq)
f.seek(0, 0)
for each in f:
    print(each)

在这里插入图片描述

OS 模块中关于文件/目录常用的函数使用方法

操作系统底层对于文件系统的访问工作原理是不一样的,因此你可能就要针对不同的系统来考虑使用哪些文件系统模块……,这样的做法是非常不友好且麻烦的,因为这样就意味着当你的程序运行环境一改变,你就要相应的去修改大量的代码来应对。有了OS(Operation System)模块,我们不需要关心什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用。
os.getcwd()用于返回当前工作目录。
os.chdir(path)用于改变当前工作目录到指定的路径。

import os
path = 'C:\\'
print("当前工作目录:",os.getcwd())
os.chdir(path)
print("目录修改成功:",os.getcwd())

在这里插入图片描述
os.listdir(path)返回path指定的文件夹包含的文件或文件夹的名字的列表。

import os
dirs = os.listdir()
for item in dirs:
    print(item)

在这里插入图片描述
os.mkdir(path)创建单层目录,如果该目录已存在抛出异常。

import os

if os.path.isdir(r'.\b') is False:
    os.mkdir(r'.\B')
    os.mkdir(r'.\B\A')

os.mkdir(r'.\C\A') 

os.makedirs(path)用于递归创建多层目录,如果该目录已存在抛出异常。

import os
os.makedirs(r'.\E\A')

os.remove(path)用于删除指定路径的文件。如果指定的路径是一个目录,将抛出 OSError。

import os
print("目录为: %s" % os.listdir(r'.\E\A'))
os.remove(r'.\E\A\test.txt')
print("目录为: %s" % os.listdir(r'.\E\A'))

os.rmdir(path)用于删除单层目录。仅当这文件夹是空的才可以, 否则, 抛出 OSError。

import os
print("目录为: %s" % os.listdir(r'.\E'))
os.rmdir(r'.\E\A')
print("目录为: %s" % os.listdir(r'.\E'))

os.removedirs(path)递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。

import os
print("目录为: %s" % os.listdir(os.getcwd()))
os.removedirs(r'.\E\A')  # 先删除A 然后删除E
print("目录为: %s" % os.listdir(os.getcwd()))

在这里插入图片描述
os.rename(src, dst)方法用于命名文件或目录,从 src 到 dst,如果 dst 是一个存在的目录, 将抛出 OSError。

import os
print("目录为: %s" % os.listdir(os.getcwd()))
os.rename("python", "python2")
print("重命名成功。")
print("目录为: %s" % os.listdir(os.getcwd()

os.system(command)运行系统的shell命令(将字符串转化成命令)

import os

path = os.getcwd() + '\\hello.py'
a = os.system(r'python %s' % path)

os.system('calc')

运行结果为打开计算器

os.curdir指代当前目录(.)
os.pardir指代上一级目录(…)
os.sep输出操作系统特定的路径分隔符(win下为\,Linux下为/)os.linesep当前平台使用的行终止符(win下为\r\n,Linux下为\n)os.name指代当前使用的操作系统(包括:‘mac’,‘nt’)

import os

print(os.curdir)
print(os.pardir)
print(os.sep)
print(os.linesep)
print(os.name)

os.path.basename(path)去掉目录路径,单独返回文件名os.path.dirname(path)去掉文件名,单独返回目录路径os.path.join(path1[, path2[, …]])将 path1,path2 各部分组合成一个路径名
os.path.split(path)分割文件名与路径,返回(f_path,f_name)元组。如果完全使用目录,它会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在。
os.path.splitext(path)分离文件名与扩展名,返回(f_path,f_name)元组。

import os
print(os.path.basename(r'C:\work\python.txt'))
print(os.path.dirname(r'C:\work\python.txt'))
print(os.path.join('C:\\', 'work', 'python.txt'))
print(os.path.split(r'C:\work\python.txt'))
print(os.path.splitext(r'C:\work\python.txt'))

在这里插入图片描述
os.path.getsize(file)返回指定文件大小,单位是字节。os.path.getatime(file)返回指定文件最近的访问时间os.path.getctime(file)返回指定文件的创建时间os.path.getmtime(file)返回指定文件的最新的修改时间浮点型秒数,可用time模块的gmtime()或localtime()函数换算

import os
import time
file = r'.\python.txt'
print(os.path.getsize(file))
print(os.path.getatime(file))
print(os.path.getctime(file))
print(os.path.getmtime(file))
print(time.gmtime(os.path.getctime(file)))
print(time.localtime(os.path.getctime(file)))

在这里插入图片描述
os.path.exists(path)判断指定路径(目录或文件)是否存在os.path.isabs(path)判断指定路径是否为绝对路径os.path.isdir(path)判断指定路径是否存在且是一个目录os.path.isfile(path)判断指定路径是否存在且是一个文件os.path.islink(path)判断指定路径是否存在且是一个符号链接os.path.ismount(path)判断指定路径是否存在且是一个悬挂点os.path.samefile(path1,path2)判断path1和path2两个路径是否指向同一个文件

import os

print(os.path.ismount('C:\\'))  # True
print(os.path.ismount('C:\\work'))  # False

序列化与反序列化

Python 的 pickle 模块实现了基本的数据序列和反序列化。通过 pickle 模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。通过 pickle 模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。pickle模块中最常用的函数为:pickle.dump(obj, file, [,protocol]) 将obj对象序列化存入已经打开的file中。obj:想要序列化的obj对象。file:文件名称。protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。pickle.load(file) 将file中的对象序列化读出。file:文件名称。

import pickle

dataList = [[1, 1, 'yes'],
            [1, 1, 'yes'],
            [1, 0, 'no'],
            [0, 1, 'no'],
            [0, 1, 'no']]
dataDic = {0: [1, 2, 3, 4],
           1: ('a', 'b'),
           2: {'c': 'yes', 'd': 'no'}}

# 使用dump()将数据序列化到文件中
fw = open(r'.\dataFile.pkl', 'wb')

# Pickle the list using the highest protocol available.
pickle.dump(dataList, fw, -1)

# Pickle dictionary using protocol 0.
pickle.dump(dataDic, fw)
fw.close()

# 使用load()将数据从文件中序列化读出
fr = open('dataFile.pkl', 'rb')
data1 = pickle.load(fr)
print(data1)
data2 = pickle.load(fr)
print(data2)
fr.close()

# [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
# {0: [1, 2, 3, 4], 1: ('a', 'b'), 2: {'c': 'yes', 'd': 'no'}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值