Task 9:文件与文件系统(Datawhale-Python学习笔记)

9.1 文件与文件系统

9.1.1 打开文件

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
Open file and return a stream. Raise OSError upon failure.

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符

常见的mode如下表所示:

打开模式执行操作
'r'以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
'w'打开一个文件只用于写入。如果该文件已存在则打开文件,从开头开始编辑。即原有内容会被删除。如果该文件不存在,创建新文件。
'x'写模式,新建一个文件,如果该文件已存在则会报错。
'a'追加模式,打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
'b'以二进制模式打开文件。一般用于非文本文件,如:图片。
't'以文本模式打开(默认)。一般用于文本文件,如:txt。
'+'可读写模式(可添加到其它模式中使用)

【例】打开一个文件,并返回文件对象,如果该文件无法被打开,会抛出OSError。

f = open('将进酒.txt')
print(f)
# <_io.TextIOWrapper name='将进酒.txt' mode='r' encoding='cp936'>

for each in f:
    print(each)

# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
# 人生得意须尽欢,莫使金樽空对月。
# 天生我材必有用,千金散尽还复来。
# 烹羊宰牛且为乐,会须一饮三百杯。
# 岑夫子,丹丘生,将进酒,杯莫停。
# 与君歌一曲,请君为我倾耳听。
# 钟鼓馔玉不足贵,但愿长醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,斗酒十千恣欢谑。
# 主人何为言少钱,径须沽取对君酌。
# 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。

9.1.2 文件对象方法

  • fileObject.close()用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发ValueError错误。
  • fileObject.read([size])用于从文件读取指定的字符数,如果未给定或为负则读取所有。
  • fileObject.readline()读取整行,包括 “\n” 字符。
  • fileObject.readlines()用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的for... in ...结构进行处理。
  • fileObject.tell()返回文件的当前位置,即文件指针当前位置。
  • fileObject.seek(offset[, whence])用于移动文件读取指针到指定位置
    • offset:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
    • whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
  • fileObject.write(str)用于向文件中写入指定字符串,返回的是写入的字符长度。
    • 在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
    • 如果文件打开模式带b,那写入文件内容时,str(参数)要用encode方法转为bytes形式,否则报错:TypeError: a bytes-like object is required, not 'str'
  • fileObject.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符\n。

9.1.3 with语句

一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。

关键词with语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行它的清理方法。
【例子】

try:
    f = open('myfile.txt', 'w')
    for line in f:
        print(line)
except OSError as error:
    print('出错啦!%s' % str(error))
finally:
    f.close()

# 出错啦!not readable

【例子】这段代码执行完毕后,就算在处理过程中出问题了,文件 f 总是会关闭。

try:
    with open('myfile.txt', 'w') as f:
        for line in f:
            print(line)
except OSError as error:
    print('出错啦!%s' % str(error))

# 出错啦!not readable    

9.2 OS模块中关于文件、目录常用的函数

我们所知道常用的操作系统就有:Windows,Mac OS,Linux,Unix等,这些操作系统底层对于文件系统的访问工作原理是不一样的,因此你可能就要针对不同的系统来考虑使用哪些文件系统模块……,这样的做法是非常不友好且麻烦的,因为这样就意味着当你的程序运行环境一改变,你就要相应的去修改大量的代码来应对。

有了OS(Operation System)模块,我们不需要关心什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用。

  • os.getcwd()用于返回当前工作目录。
  • os.chdir(path)用于改变当前工作目录到指定的路径。
import os

path = 'C:\\'
print("当前工作目录 : %s" % os.getcwd())
# 当前工作目录 : C:\Users\Administrator\PycharmProjects\untitled1
os.chdir(path)
print("目录修改成功 : %s" % os.getcwd())
# 目录修改成功 : C:\
  • listdir (path='.')返回path指定的文件夹包含的文件或文件夹的名字的列表。
  • os.mkdir(path)创建单层目录,如果该目录已存在抛出异常。
  • os.makedirs(path)用于递归创建多层目录,如果该目录已存在抛出异常。
  • os.remove(path)用于删除指定路径的文件。如果指定的路径是一个目录,将抛出 OSError。
  • os.remove(path)用于删除指定路径的文件。如果指定的路径是一个目录,将抛出 OSError。
  • os.rmdir(path)用于删除单层目录。仅当这文件夹是空的才可以, 否则, 抛出 OSError。
  • os.removedirs(path)递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。
  • os.rename(src, dst)方法用于重命名文件或目录,将src更名为 dst,如果dst是一个存在的目录, 将抛出 OSError。
  • os.system(command)运行系统的shell命令(将字符串转化成命令)

【例】先自行创建一个a.py的文件,然后由shell命令打开。

import os

path = os.getcwd() + '\\a.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指代当前使用的操作系统(包括:macnt

  • 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)元组。

  • os.path.getsize(file)返回指定文件大小,单位是字节。

  • os.path.getatime(file)返回指定文件最近的访问时间

  • os.path.getctime(file)返回指定文件的创建时间

  • os.path.getmtime(file)返回指定文件的最新的修改时间:浮点型秒数,可用time模块的gmtime()或localtime()函数换算

  • 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两个路径是否指向同一个文件

9.3 序列化与反序列化

Python 的pickle模块实现了基本的数据序列和反序列化。

  • 通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
  • 通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

pickle模块中最常用的函数为:

pickle.dump(obj, file, [,protocol])obj对象序列化存入已经打开的file中。

obj:想要序列化的obj对象。
file:文件名称。
protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。


pickle.load(file)file中的对象序列化读出。

练习题:

  1. 打开中文字符的文档时,会出现乱码,Python自带的打开文件是否可以指定文字编码?还是只能用相关函数?
    答:指定编码utf-8

  2. 编写程序查找最长的单词

输入文档: res/test.txt

题目说明:

"""
Input file
   test.txt
   
Output file
   ['general-purpose,', 'object-oriented,']
   
"""
def longest_word(filename):
    # your code here
        pass
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值