Python学习总结(一)——文件操作

Python学习总结(一)——文件操作

1、文件类别

  1. 文本文件
    文本文件存储的是普通“字符”文本,python 默认为 unicode 字符集(两个字节表示
    一个字符,最多可以表示:65536 个),可以使用记事本程序打开。但是,像 word 软件编辑的文档不是文本文件。
  2. 二进制文件
    二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件
    解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等。

2、创建文件对象open()

操作类型:

模式描述
r读 read 模式
w写 write 模式。如果文件不存在则创建;如果文件存在,则重写新内容;
a追加 append 模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容
b二进制 binary 模式(可与其他模式组合使用)
+读、写模式(可与其他模式组合使用)

示例代码:

f = open("../wenjian/IO.txt","w")
first = "The first python sentense."
f.write(first)
f.close()

注意:

文本文件对象和二进制文件对象的创建:如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。

3、文本文件的写入

write(a):把字符串 a 写入到文件中
writelines(b):把字符串列表写入文件中,不添加换行符

4、close()关闭文件流

为了确保打开的文件对象正常关闭,一般结合异常机制的 finally 或者 with 关键字实现无论何种情况都能关闭打开的文件对象

(1)异常机制——示例代码

try:
    f = open(r"yichang.txt","a")
    message = "this is a message."
    messagelist = ["first ","second ","third"]
    messagelist01 = ["first\n","second\n","third\n"]
    f.write(message+"\n")    # write(a):把字符串 a 写入到文件中
    f.writelines(messagelist)   # writelines(b):把字符串列表写入文件中,不添加换行符
    f.write("\n")
    f.writelines(messagelist01)
except BaseException as e:
    print(e)
finally:
    f.close()

(2)with上下文管理器——示例代码

with open("yichang.txt","w") as f:
    f.write("11")

5、文本文件的读取

文件的读取一般使用如下三个方法:

1. read([size])
    从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。
2. readline()
    读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
3. readlines()
    文本文件中,每一行作为一个字符串存入列表中,返回该列表

示例代码:

with open("read.txt","r",encoding="utf-8") as f:
    str = f.read(3)  # 读取文件前3个字符
    print("***********读取文件前3个字符*******************")
    print(str)


with open("read.txt","r",encoding="utf-8") as f:
    str = f.read()  # 读取所有文件
    print("************读取所有文件内容*******************")
    print(str)


with open("read.txt","r",encoding="utf-8") as f:
    str = f.readline()   # 读取文件一行
    print("*************读取文件第一行********************")
    print(str,end="")


with open("read.txt","r",encoding="utf-8") as f:
    str = f.readlines()  # 按行读取文件所有内容
    print("********按行读取文件所有内容,按列表返回**********")
    print(str)

运行结果:

***********读取文件前3个字符*******************
I l
************读取所有文件内容*******************
I love jialun.

*************读取文件第一行********************
I love jialun.
********按行读取文件所有内容,按列表返回**********
['I love jialun.\n']

6、文件对象的常用属性和方法

常用属性:

属性说明
name返回文件的名字
mode返回文件的打开模式
closed若文件被关闭则返回 True

常用方法:

方法名说明
read([size])从文件中读取 size 个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
readline()从文本文件中读取一行内容
readlines()把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
write(str)将字符串 str 内容写入文件
writelines(s)将字符串列表 s 写入文件文件,不添加换行符
seek(offset[,whence])把文件指针移动到新的位置,offset 表示相对于 whence 的多少个字节的偏移量;offset:off 为正往结束方向移动,为负往开始方向移动 whence 不同的值代表不同含义:0: 从文件头开始计算(默认值)1:从当前位置开始计算 2:从文件尾开始计算
tell()返回文件指针的当前位置
truncate([size])不论指针在什么位置,只留下指针前 size 个字节的内容,其余全部删除;如果没有传入 size,则当指针当前位置到文件末尾内容全部删除
flush()把缓冲区的内容写入文件,但不关闭文件
close()把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源

常用方法之seek示例代码:

with open("read.txt","r",encoding="utf-8") as f:
    print("文件名是:{0}".format(f.name))
    print("指针位置1:",end="")
    print(f.tell())
    print("读文件一行:",end="")
    print(f.readline(),end="")
    print("指针位置2:", end="") #换行符\n占两个字符
    print(f.tell())
    f.seek(0,0)
    print(f.readline(),end="")
    f.seek(3,0)
    print("指针位置3:", end="")
    print(f.tell())
    print(f.readline(),end="")

运行结果:

文件名是:read.txt
指针位置10
读文件一行:I love renjialun.
指针位置219
I love renjialun.
指针位置33
ove renjialun.

7、文件序列化

序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
简单来说就是将多个对象转成一个流数据,进行传输。
我们可以使用 pickle 模块中的函数,实现序列化和反序列操作
序列化我们使用:
pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对

示例:

import pickle

a1 = "yingtao"
a2 = 123
a3 = [1,2,3]

with open("data.dat","wb") as f:  # 文件后缀名随便
    pickle.dump(a1,f)
    pickle.dump(a2,f)
    pickle.dump(a3,f)

with open("data.dat","rb") as f:
    b1 = pickle.load(f)
    b2 = pickle.load(f)
    b3 = pickle.load(f)
    print("b1:{0}----b2:{1}----b3:{2}".format(b1,b2,b3))

print("id--a1:{0},b1:{1}".format(id(a1),id(b1)))   #是两个不同的对象

运行结果:

b1:yingtao----b2:123----b3:[1, 2, 3]
id--a1:1868604569264,b1:1868606998576

8、CSV文件的读取

import csv

with open("csvfile.csv","w") as f:
    write_csv = csv.writer(f)
    write_csv.writerow(["ID","姓名","年龄"])
    listwrite = [["1001","任嘉伦","32"],["1002","嘉人","22"]]
    write_csv.writerows(listwrite)

with open("csvfile.csv","r") as f:
    read_csv = csv.reader(f) #reader有一个指针,若两个print同时存在,则文件数据只打印一次
    # print(list(read_csv))
    for i in read_csv:
        print(i)

运行结果:

['ID', '姓名', '年龄']
[]
['1001', '任嘉伦', '32']
[]
['1002', '嘉人', '22']
[]

以上方法中写入的文件中,每一行数据都会有一行空白行,解决的方法是:

with open("csvfile.csv","w",newline='') as f:
    write_csv = csv.writer(f)
    write_csv.writerow(["ID","姓名","年龄"])
    listwrite = [["1001","任嘉伦","32"],["1002","嘉人","22"]]
    write_csv.writerows(listwrite)

9、os模块以及os.path模块

os模块可以帮助我们直接对操作系统进行操作。

代码示例:

# os.system相当于Windows里面的Win+R快捷键调出的运行
import os
os.system("notepad.exe")  #调出记事本
os.system("regedit")   #调出注册表编辑器
os.system("ping www.baidu.com")
os.system("cmd")


# 直接调用可执行的文件
os.startfile(r"C:\Program Files\Oray\SunLogin\SunloginClient\SunloginClient.exe")

os对文件和目录的相关操作:

方法名描述
remove(path)删除指定的文件
rename(src,dest)重命名文件或目录
stat(path)返回文件的所有属性
listdir(path)返回 path 目录下的文件和目录列表
mkdir(path)创建目录
makedirs(path1/path2/path3/… )创建多级目录
rmdir(path)删除目录
removedirs(path1/path2…)删除多级目录
getcwd()返回当前工作目录:current work dir
chdir(path)把 path 设为当前工作目录
walk()遍历目录树
sep当前操作系统所使用的路径分隔符

示例代码:

import os

############获取文件和文件夹相关的信息##################
print(os.name)  # windows -> nt  linux/unix -> posix
print(os.sep)  # 路径分隔符  windows -> \  linux/unix -> /
print(repr(os.linesep))  # 给出当前平台使用的行终止符 windows -> \r\n  linux/unix -> \n  Mac -> \r
print(os.stat("OS_wenjian.py"))

###############关于文件工作目录的操作#########################
print(os.getcwd())  # 获取当前路径
os.mkdir("文件")
os.chdir("d:")
os.mkdir("wenjian")
os.rmdir("wenjian")
os.rmdir("文件")
os.makedirs("文件/python/01")
os.removedirs("文件/python/01")  # 只能删除空目录
os.makedirs("../电影/港片/周星驰")
os.rename("../电影","../movie")
dir = os.listdir("../movie")  # 只可以列出子目录,孙子节点无法列出
print(dir)

os.path模块:

常用方法:

方法描述
isabs(path)判断 path 是否绝对路径
isdir(path)判断 path 是否为目录
isfile(path)判断 path 是否为文件
exists(path)判断指定路径的文件是否存在
getsize(filename)返回文件的大小
abspath(path)返回绝对路径
dirname( p)返回目录的路径
getatime(filename)返回文件的最后访问时间
getmtime(filename)返回文件的最后修改时间
walk(top,func,arg)递归方式遍历目录
join(path,*paths)连接多个 path
split(path)对路径进行分割,以列表形式返回
splitext(path)从路径中分割文件的扩展名

代码示例:

##########获得文件目录、文件的基本信息##################
# 是否为绝对路径
print(os.path.isabs("D:/Python/project/studyPython/wenjian/TXT/a.txt"))   # True
# 是否为目录
print(os.path.isdir("D:/Python/project/studyPython/wenjian/TXT/a.txt"))   # False
# 是否为文件
print(os.path.isfile("D:/Python/project/studyPython/wenjian/TXT/a.txt"))  # True
# 文件是否存在
print(os.path.exists("D:/Python/project/studyPython/wenjian/TXT/a.txt"))  # True
# 获取文件大小
print(os.path.getsize("D:/Python/project/studyPython/wenjian/TXT/a.txt"))  # 74
# 输出绝对路径
print(os.path.abspath("./TXT/a.txt"))  # D:\Python\project\studyPython\wenjian\TXT\a.txt
# 输出目录路径
print(os.path.dirname("D:/Python/project/studyPython/wenjian/TXT/a.txt"))   # D:/Python/project/studyPython/wenjian/TXT


############获得文件的创建时间、最后访问时间、最后修改时间#####################
# 获取文件的创建时间
print(os.path.getctime("D:/Python/project/studyPython/wenjian/TXT"))   # 1618641293.6957965
# 获取文件的最后访问时间
print(os.path.getatime("D:/Python/project/studyPython/wenjian/TXT"))   # 1618641582.6866298
# 获取文件的最后修改时间
print(os.path.getmtime("D:/Python/project/studyPython/wenjian/TXT"))   # 1618641535.1860154


##############对文件路径进行分割、连接操作######################
path = os.path.abspath("./TXT/a.txt")
# 对文件路径进行分割,获取文件名
print(os.path.split(path))   # ('D:\\Python\\project\\studyPython\\wenjian\\TXT', 'a.txt')
# 对文件路径进行分割,获取文件扩展名
print(os.path.splitext(path))  # ('D:\\Python\\project\\studyPython\\wenjian\\TXT\\a', '.txt')
# 对多个路径进行连接
print(os.path.join("aa","bb","cc"))  # aa\bb\cc

os.walk方法遍历所有文件及目录:

os.walk方法:
返回一个 3 个元素的元组,(dirpath, dirnames, filenames),
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件

代码示例:

import os

all_file = []
path = os.getcwd()
file_list = os.walk(path)
for dirpath,dirnames,filenames in file_list:
    for dirname in dirnames:
        # print(dirname)
        # print("######################")
        all_file.append(os.path.join(dirpath,dirname))
    for filename in filenames:
        # print(filename)
        all_file.append(os.path.join(dirpath,filename))

print(all_file)

文件的拷贝、压缩与解压缩:


'''
    shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。
'''


import shutil

########文件复制################

# 复制文件内容
shutil.copyfile("read.txt","./TXT/copy_read.txt")
# 复制文件目录
shutil.copytree("movie/港片","电影")  # 电影文件夹存在时无法执行此语句,原因是防止文件覆盖
# 选择性复制文件目录
shutil.copytree("movie/港片","选择电影",ignore=shutil.ignore_patterns("*.txt","*.html"))



########文件压缩################

# 使用shutil压缩文件
shutil.make_archive("压缩/01","zip","电影")  # 第一个参数是压缩之后的路径,第二个参数是压缩文件的后缀,第三个参数是需要压缩文件的位置



import zipfile

# 使用zipfile压缩文件,使用此方法进行压缩更为精细
z1 = zipfile.ZipFile("压缩/02.zip","w")  # 第一个参数是压缩文件后的路径及名称,第二个参数表示了压缩与解压缩的区别,w是压缩,r是解压缩
z1.write("csvfile.csv")
z1.write("GBK.txt")
z1.close()

# 使用zipfile解压缩文件
z2 = zipfile.ZipFile("压缩/02.zip","r")
z2.extractall("解压缩")
z2.close()
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验目的】 1. 了解文件系统的原理; 2. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 【实验准备】 1.文件的逻辑结构  顺序文件  索引文件  索引顺序文件  直接文件和哈希文件 2.外存分配方式  连续分配  链接分配  索引分配 【实验内容】 1. 实验要求 要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 2. 实验题目  设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。  程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。  为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 因系统小,文件目录的检索使用了简单的线性搜索。文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)。 M D F 用户名 文件目录指针 用户名 文件目录指针 U F D 文件名 保护码 文件长度 文件名 A F D 打开文件名 打开保护码 读写指针

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值