学习Python Task 9 文件与文件系统 笔记

资料链接

1. 文件与文件系统

1.1 打开文件

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) 打开一个文件,并返回文件对象,如果该文件无法被打开,会抛出OSError
参数意义:

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

常用的mode
在这里插入图片描述
如果文件打开模式带b,那写入文件内容时,写入的str(参数)要用encode方法转为bytes形式,否则报错:TypeError: a bytes-like object is required, not ‘str’。(联系下文1.2 - 7)

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

一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行它的清理方法。

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 模块中关于文件/目录常用的函数

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

  1. os.getcwd() 用于返回当前工作目录。
    os.chdir(path) 用于改变当前工作目录到指定的路径。
  2. listdir (path='.')返回path指定的文件夹包含的文件或文件夹的名字的列表。
  3. 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') # FileNotFoundError
  1. os.makedirs(path) 用于递归创建多层目录,如果该目录已存在抛出异常。
import os
os.makedirs(r'.\E\A')
  1. os.remove(path) 用于删除指定路径的文件。如果指定的路径是一个目录,将抛出 OSError
  2. os.rmdir(path) 用于删除单层目录。仅当这文件夹是空的才可以, 否则, 抛出 OSError。
  3. os.removedirs(path) 递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。
  4. os.rename(src, dst) 方法用于命名文件或目录,把 src 改名为 dst,如果 dst 是一个存在的目录, 将抛出 OSError。
  5. os.system(command) 运行系统的shell命令(将传入的字符串转化成命令command)。
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 指代当前使用的操作系统(包括:'mac''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)元组。
os.path.getsize(file) 返回指定文件大小,单位是字节。
os.path.getatime(file) 返回指定文件最近的访问时间
os.path.getctime(file) 返回指定文件的创建时间
os.path.getmtime(file) 返回指定文件的最新的修改时间
浮点型秒数,可用time模块的gmtime()或localtime()函数换算
s.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两个路径是否指向同一个文件

3. 序列化与反序列化

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

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

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

  1. pickle.dump(obj, file, [,protocol]) 将 obj 对象序列化存入已经打开的 file 中。
    参数含义:
    obj:想要序列化的obj对象。
    file:文件名称。
    protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。
  2. pickle.load(file) 将file中的对象序列化读出。file:文件名称。

练习

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

2、编写程序查找最长的单词
输入文档: res/test.txt

"""  
Input file
   t.txt
   The satellite will be mainly used for land surveys, city planning, land right confirmation, road network design, crop yield estimation and disaster prevention and mitigation.
It will also provide information for the development of the Belt and Road Initiative.
Output file
   略
"""
import re

def longest_word(filename):
    f = open(filename, mode='r')
    lst1 = f.readlines()
    lst2 = []
    lst3 = []
    for i in range(len(lst1)):
        str1 = lst1[i]
        lst2 = lst2 + re.split(' |,|\n', str1) # 不能把英文的句号加进去
    temp = len(lst2[0])
    lst3.append(lst2[0])
    ind = 0
    for j in range(len(lst2)-1):
        if len(lst2[j+1]) > temp:
            lst3 = []
            temp = len(lst2[j+1])
            lst3.append(lst2[j+1])
            ind = j+1
        if len(lst2[j+1]) == temp:
            lst3.append(lst2[j+1])
    return lst3

print(longest_word("t.txt"))
# ['confirmation', 'confirmation']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值