Task9 文件与文件系统

  • 练习题
    • 1、打开中文字符的文档时,会出现乱码,Python自带的打开文件是否可以指定文字编码?还是只能用相关函数?
    • 2、编写程序查找最长的单词
  • 1. 文件与文件系统
    • 打开文件
    • 文件对象方法
    • 简洁的 with 语句
  • 2. OS 模块中关于文件/目录常用的函数
  • 3. 序列化与反序列化
  • 参考文献

练习题

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

解决python因为中文编码问题出现乱码

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

输入文档: res/test.txt

题目说明:

"""Input filetest.txtOutput file['general-purpose,', 'object-oriented,']"""
def longest_word(filename):# your code herepass

程序设计思路:
txt文件中的文章是带有标点符号的,因此要先把所有的标点符号去掉,换成空格,再以空格为界限分割字符串,最后利用max函数求得txt文件中最长的字符串。

eg:test文件内容

Hooray! It’s snowing! It’s time to make a snowman.James runs out. He makes a big pile of snow. He puts a big snowball on top. He adds a scarf and a hat. He adds an orange for the nose. He adds coal for the eyes and buttons.In the evening, James opens the door. What does he see? The snowman is moving! James invites him in. The snowman has never been inside a house. He says hello to the cat. He plays with paper towels.A moment later, the snowman takes James’s hand and goes out.They go up, up, up into the air! They are flying! What a wonderful night!The next morning, James jumps out of bed. He runs to the door.He wants to thank the snowman. But he’s gone.

编写程序:

import stringdef longest_word(filename):f = open(filename, 'r+')lines = f.readlines()s=str(lines)for p in string.punctuation:s = s.replace(p ," ")return(max(s.split(), key=len))print(longest_word('harrypotter.txt'))
print(longest_word('test.txt'))

unDursleyish
wonderful

程序可能存在的问题:对于类似“It’s”的单词,程序默认把它分成了“It”和“s”两个部分。

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: 一般使用utf8errors: 报错级别newline: 区分换行符

常见的mode如下表所示:

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

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

f = open('将进酒.txt')
print(f)

FileNotFoundError: [Errno 2] No such file or directory: ‘将进酒.txt’
若程序目录下存在,则:

f = open('将进酒.txt')
print(f)for each in f:print(each)

<_io.TextIOWrapper name=‘将进酒.txt’ mode=‘r’ encoding=‘cp936’>
君不见,黄河之水天上来,奔流到海不复回。

君不见,高堂明镜悲白发,朝如青丝暮成雪。

人生得意须尽欢,莫使金樽空对月。

天生我材必有用,千金散尽还复来。

烹羊宰牛且为乐,会须一饮三百杯。

岑夫子,丹丘生,将进酒,杯莫停。

与君歌一曲,请君为我倾耳听。

钟鼓馔玉不足贵,但愿长醉不复醒。

古来圣贤皆寂寞,惟有饮者留其名。

陈王昔时宴平乐,斗酒十千恣欢谑。

主人何为言少钱,径须沽取对君酌。

五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。

文件对象方法

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

f = open("将进酒.txt")
print('FileName:', f.name)
f.close()

FileName: 将进酒.txt

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)
f.close()

君不见,黄河之水天上来,奔流到海不复回。

42

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'))
print(f.seek(5))
print(f.read(1))
print(f.seek(-3, 2))
print(f.read(1))

16
5
b’5’
13
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)

君不见,黄河之水天上来,奔流到海不复回。

君不见,高堂明镜悲白发,朝如青丝暮成雪。

人生得意须尽欢,莫使金樽空对月。

天生我材必有用,千金散尽还复来。

烹羊宰牛且为乐,会须一饮三百杯。

岑夫子,丹丘生,将进酒,杯莫停。

与君歌一曲,请君为我倾耳听。

钟鼓馔玉不足贵,但愿长醉不复醒。

古来圣贤皆寂寞,惟有饮者留其名。

陈王昔时宴平乐,斗酒十千恣欢谑。

主人何为言少钱,径须沽取对君酌。

五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。

作者:李白

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()

TypeError: ‘str’ object is not callable
按照示例程序,并没有打印出“出错啦!not readable”,经过查找资料,是str起了冲突,将上述程序修正为:

try:f = open('myfile.txt', 'w')for line in f:print(line)
except OSError as error:出错啦!not readable
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' % 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())
os.chdir(path)
print("目录修改成功 : %s" % os.getcwd())

当前工作目录 : C:\Users\Administrator\Desktop\code\python_basic
目录修改成功 : 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: [WinError 3] 系统找不到指定的路径。: ‘.\C\A’

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

lsgo.txt
C:\test
C:\test\lsgo.txt
(‘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))
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 osprint(os.path.ismount('D:\\'))
print(os.path.ismount('D:\\Test'))

True
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’}}

参考文献

TypeError: ‘str’ object is not callable的几种情况及解决办法

Task9 文件与文件系统相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Python_Task09:文件与文件系统

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

  10. Task09文件与文件系统

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

最新文章

  1. 如何在PHP中保护数据库密码?
  2. 人工智能免费公开课一网打尽!14个类别、230门课程,GitHub标星6000+
  3. python绘制随机数直方图-python plotly绘制直方图实例详解
  4. powershell 脚本运行策略,参数....
  5. linux 脚本 java_linux系统下运行java项目的脚本编写
  6. 深度学习模型在FPGA上的部署
  7. python读取fiddler_Python3.x+Fiddler抓取APP数据
  8. python将word文档转换为txt
  9. [CodeComplete]创建一个函数需要理由吗
  10. 计算机毕业设计springboot+vue+elementUI高校志愿者管理系统(源码+系统+mysql数据库+Lw文档)
  11. UVaOJ 12304 2D Geometry 110 in 1!
  12. 参考 | 升级 Win11 移动热点开不了或者开了连不上
  13. SSH新学,关于面向对象的看法
  14. 函数最值题目及答案_有关函数的极值与导数的测试题及答案
  15. Apktool|ShakaApktool 简体中文汉化版|APK反编译工具(更新)
  16. HTML制作个人网页制作(简单静态HTML个人博客网页作品)
  17. torch dataloader 数据并行_PyTorch Parallel Training(单机多卡并行、混合精度、同步BN训练指南文档)
  18. java答辩记录问题,S2_javaWeb答辩问题集 qlzx
  19. 光学三角法知识点总结
  20. 可靠性技术在医学仪器中的应用前景分析

热门文章

  1. python中e怎么计算_蒙特卡洛法计算自然常数e——python编程及可视化
  2. 【coq】函数语言设计 笔记 02 - induction
  3. dell t320 raid linux,Dell T320服务器阵列卡驱动下载
  4. Summary of defect detection algorithms based on deep learning
  5. 阿里P9首次公开:阿里面试官都问些什么?
  6. 关于红帽RHCE考试的那些事儿
  7. 局计算机信息网络安全管理办法,区科技局网络安全与信息化管理制度
  8. html新浪短域名api,新浪短网址官方api接口
  9. 最新官方新浪短网址API接口分享-附代码调用演示
  10. 如何解决浏览器音视频video/audio设置自动播放autoplay无效问题?