文件与文件系统

  • 学习教程
    • 1. 文件与文件系统
      • 打开文件
      • 文件对象方法
      • 简洁的 with 语句
    • 2. OS 模块中关于文件/目录常用的函数
    • 3. 序列化与反序列化
  • 练习题

学习教程

转自:https://github.com/GRF-Sunomikp31/Robomaster-skyteam

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如下表所示:

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

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

文件对象方法

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

【例】

f = open("将进酒.txt")
print('FileName:', f.name)  # FileName: 将进酒.txt
f.close()
  • fileObject.read([size]) 用于从文件读取指定的字符数,如果未给定或为负则读取所有。

【例】

f = open('将进酒.txt', 'r')
line = f.read(20)
print("读取的字符串: %s" % line)
# 读取的字符串: 君不见,黄河之水天上来,奔流到海不复回。f.close()
  • fileObject.readline()读取整行,包括 “\n” 字符。

【例】

f = open('将进酒.txt', 'r')
line = f.readline()
print("读取的字符串: %s" % line)
# 读取的字符串: 君不见,黄河之水天上来,奔流到海不复回。
f.close()
  • fileObject.readlines()用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的for… in … 结构进行处理。

【例】

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

【例】

f = open('将进酒.txt', 'r')
line = f.readline()
print(line)
# 君不见,黄河之水天上来,奔流到海不复回。
pos = f.tell()
print(pos)  # 42
f.close()
  • fileObject.seek(offset[, whence])用于移动文件读取指针到指定位置。
  • offset:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
  • whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1代表从当前位置开始算起,2 代表从文件末尾算起。

【例】

f = open('将进酒.txt', 'r')
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('workfile.txt', 'wb+')
print(f.write(b'0123456789abcdef'))  # 16
print(f.seek(5))  # 5
print(f.read(1))  # b'5'
print(f.seek(-3, 2))  # 13
print(f.read(1))  # b'd'

在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。

如果文件打开模式带b,那写入文件内容时,str(参数)要用encode方法转为bytes形式,否则报错:TypeError: a bytes-like object is required, not 'str'

【例】

str = '...'
# 文本 = Unicode字符序列
# 相当于 string 类型str = b'...'
# 文本 = 八位序列(0到255之间的整数)
# 字节文字总是以‘b’或‘B’作为前缀;它们产生一个字节类型的实例,而不是str类型。
# 相当于 byte[]

【例】

f = open('将进酒.txt', 'r+')
str = '\n作者:李白'
f.seek(0, 2)
line = f.write(str)
f.seek(0, 0)
for each in f:print(each)# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
# 人生得意须尽欢,莫使金樽空对月。
# 天生我材必有用,千金散尽还复来。
# 烹羊宰牛且为乐,会须一饮三百杯。
# 岑夫子,丹丘生,将进酒,杯莫停。
# 与君歌一曲,请君为我倾耳听。
# 钟鼓馔玉不足贵,但愿长醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,斗酒十千恣欢谑。
# 主人何为言少钱,径须沽取对君酌。
# 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
# 作者:李白f.close()
  • fileObject.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符\n。

【例】

f = open('test.txt', 'w+')
seq = ['小马的程序人生\n', '老马的程序人生']
f.writelines(seq)
f.seek(0, 0)
for each in f:print(each)# 小马的程序人生
# 老马的程序人生
f.close()

简洁的 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

2. OS 模块中关于文件/目录常用的函数

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

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

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

【例】

import ospath = 'C:\\'
print("当前工作目录 : %s" % os.getcwd())
# 当前工作目录 : C:\Users\Administrator\PycharmProjects\untitled1
os.chdir(path)
print("目录修改成功 : %s" % os.getcwd())
# 目录修改成功 : C:\
  • listdir (path='.')返回path指定的文件夹包含的文件或文件夹的名字的列表。

【例】

import osdirs = os.listdir()
for item in dirs:print(item)
  • os.mkdir(path)创建单层目录,如果该目录已存在抛出异常。

【例】

import osif os.path.isdir(r'.\b') is False:os.mkdir(r'.\B')os.mkdir(r'.\B\A')os.mkdir(r'.\C\A') # FileNotFoundError
  • os.makedirs(path)用于递归创建多层目录,如果该目录已存在抛出异常。

【例】

import os
os.makedirs(r'.\E\A')
  • os.remove(path)用于删除指定路径的文件。如果指定的路径是一个目录,将抛出 OSError。

【例】首先创建.\E\A\text.txt文件,然后进行删除。

import osprint("目录为: %s" % os.listdir(r'.\E\A'))
os.remove(r'.\E\A\test.txt')
print("目录为: %s" % os.listdir(r'.\E\A'))
  • os.rmdir(path)用于删除单层目录。仅当这文件夹是空的才可以, 否则, 抛出 OSError。

【例】首先创建.\E\A目录,然后进行删除。

import osprint("目录为: %s" % os.listdir(r'.\E'))
os.rmdir(r'.\E\A')
print("目录为: %s" % os.listdir(r'.\E'))
  • os.removedirs(path)递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。

【例】首先创建.\E\A目录,然后进行删除。

import osprint("目录为: %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。

【例】把test.txt文件重命名为test2.txt。

import osprint("目录为: %s" % os.listdir(os.getcwd()))
os.rename("test.txt", "test2.txt")
print("重命名成功。")
print("目录为: %s" % os.listdir(os.getcwd()))
  • os.system(command)运行系统的shell命令(将字符串转化成命令)

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

import ospath = 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指代当前使用的操作系统(包括:‘mac’,‘nt’)

【例】

import osprint(os.curdir)  # .
print(os.pardir)  # ..
print(os.sep)  # \
print(os.linesep)
print(os.name)  # nt
  • 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:\test\lsgo.txt'))  # lsgo.txt
# 返回目录路径
print(os.path.dirname(r'C:\test\lsgo.txt'))  # C:\test
# 将目录和文件名合成一个路径
print(os.path.join('C:\\', 'test', 'lsgo.txt'))  # C:\test\lsgo.txt
# 分割文件名与路径
print(os.path.split(r'C:\test\lsgo.txt'))  # ('C:\\test', 'lsgo.txt')
# 分离文件名与扩展名

print(os.path.splitext(r’C:\test\lsgo.txt’)) # (‘C:\test\lsgo’, ‘.txt’)

  • os.path.getsize(file)返回指定文件大小,单位是字节。
  • os.path.getatime(file)返回指定文件最近的访问时间
  • os.path.getctime(file)返回指定文件的创建时间
  • os.path.getmtime(file)返回指定文件的最新的修改时间

浮点型秒数,可用time模块的gmtime()或localtime()函数换算
【例】

import os
import timefile = r'.\lsgo.txt'
print(os.path.getsize(file))  # 30
print(os.path.getatime(file))  # 1565593737.347196
print(os.path.getctime(file))  # 1565593737.347196
print(os.path.getmtime(file))  # 1565593797.9298275
print(time.gmtime(os.path.getctime(file)))
# time.struct_time(tm_year=2019, tm_mon=8, tm_mday=12, tm_hour=7, tm_min=8, tm_sec=57, tm_wday=0, tm_yday=224, tm_isdst=0)
print(time.localtime(os.path.getctime(file)))
# time.struct_time(tm_year=2019, tm_mon=8, tm_mday=12, tm_hour=15, tm_min=8, tm_sec=57, tm_wday=0, tm_yday=224, tm_isdst=0)
  • 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 osprint(os.path.ismount('D:\\'))  # True
print(os.path.ismount('D:\\Test'))  # False

3. 序列化与反序列化

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 pickledataList = [[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'}}

练习题

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

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

可以通过encoding指定编码格式
2、编写程序查找最长的单词

输入文档: res/test.txt

题目说明:

"""Input filetest.txtOutput file['general-purpose,', 'object-oriented,']"""
def longest_word(filename):try:with open(filename, 'r', encoding='UTF-8') as f:l =[]String = f.read().split(' ')s = [[x , len(x)] for x in String]s = sorted(s, key=lambda x: x[1], reverse= True)for x in s:if x[1] < s[0][1]:breakl.append(x[0])return lexcept OSError as error:print('出错啦!%s' % str(error))# your code herepass

Python_Task09:文件与文件系统相关推荐

  1. s-stat 查看文件或者文件系统的状态信息

    命令用法 stat [OPTION]... FILE... -L 查看链接文件 -f 查看文件系统信息,而非文件信息 -c --format=%a 支持使用格式化字符串输出结果,支持\n,\t等转义字 ...

  2. linux 函数 缩小文件,linux文件系统的处理函数

    文件系统 通用:rename(原路径名,新路径名);  修改文件名 remove(路径名);     删除文件或路径 symlink(原路径名,符号链接名);   建立文件或路径的软链接 access ...

  3. c++创建文件_JavaNote 文件系统及Java文件基本操作

    文件概述 文件系统是由OS(操作系统)管理的: 文件系统和Java进程是平行的,是两套系统: 文件系统是由文件夹和文件递归组合而成: 文件目录分隔符 Linux/Unix 用/隔开 Windows用隔 ...

  4. 六、文件管理(1.文件和文件系统)

    文件和文件系统 一. 文件.记录和数据项 1. 数据项 ①基本数据项:由数据名和数据类型组成,是数据组织中可以命名的逻辑数据单位(原子数据),例如:姓名(符串类型),年龄(整型). ②组合数据项:有若 ...

  5. 文件管理之文件和文件系统

    文件是数据的一种组织形式,而文件管理系统是指文件和对文件进行操纵和管理的软 件集合. 数据的组成 基于文件系统的概念而把数据的组成分为数据项.记录和文件三级 ⑴ 数据项: 基本数据项----用于描述一 ...

  6. datawhale组队学习task9—文件与文件系统

    1. 文件与文件系统 打开文件 open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, close ...

  7. Python学习 Task9:文件与文件系统

    Task9:文件与文件系统 文件与文件系统 1.1 打开文件 1.2 文件对象方法 1.3 简洁的 with 语句 文件与文件系统 1.1 打开文件 open(file, mode='r', buff ...

  8. Python基础语法笔记(十六)文件与文件系统

    Reference https://github.com/datawhalechina/team-learning-program/blob/master/PythonLanguage 1. 文件与文 ...

  9. Task09文件与文件系统

    文件与文件系统 文件:由创建者定义的.具有文件名的一组相关元素的集合. 文件管理:把所管理的程序和数据组织成一系列的文件,并能进行合理的存储.使用等操作. 打开文件 open(file, mode=' ...

最新文章

  1. Your First Concordion.Net Project (Part 5)-Running Specs with Gallio
  2. “放到桌面”的Servlet实现
  3. CodeForces 811B Vladik and Complicated Book
  4. 563. 二叉树的坡度
  5. 学习C++和编程的50个观点
  6. 2020年高考数学试题难吗?历史上最难数学卷不是2003!
  7. 太阳系八大行星碰撞的视频_火星的身世:从太阳系的起源说起
  8. 08-SSH综合案例:前台用户模块:注册页面的前台JS校验
  9. android中资源文件的两种访问方式,Android_Android学习笔记-保存文件(Saving Files),Android设备有两种文件存储区域 - phpStudy...
  10. jQuery 第三章
  11. 【物理应用】基于matlab GUI家庭室内温湿度控制【含Matlab源码 326期】
  12. 【深度学习】卷积神经网络(CNN)原理
  13. 软件开发中如何评估工作量
  14. python 单词拆音节_基于Trie树进行拆分字符串变成拼音音节(一):构建拼音音节模型...
  15. 2021-2022 ICPC, NERC, Northern Eurasia Onsite C Connect the Points
  16. awk linux 分隔_Linux:批量修改分隔符(awk、BEGIN、FS、OFS、print、tr命令)
  17. (下篇)校园小程序前端部署教程-优雅草老八写
  18. Android触摸事件实现笔触画布
  19. 【Ubuntu】Ubuntu16.04 安装显卡驱动重启黑屏问题处理
  20. 如何在注册表中删除用户帐户信息。

热门文章

  1. 如何找自己想要的项目?看这里告诉你答案
  2. DAQWare for Digilent Analog Discovery发布1.0.4版本
  3. Go语言从控制台读取数据
  4. 【愚公系列】2022年04月 密码学攻击-RSA之暴力分解N
  5. C中的strlen()函数说明,以及使用时要注意事项
  6. 物联网中你需要了解的ESP8266最基本的知识!
  7. 中电金信Gien享汇・大数据专题|大型金控公司数字化转型解读
  8. 申宝投资-指数上周五中阴杀跌
  9. 【转】好资料,非常棒!!!
  10. ZABBIX短信告警-创蓝短信平台