学习笔记
一、文件与文件系统
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: 区分换行符
- 打开一个文件,并返回文件对象,如果该文件无法被打开,会抛出OSError。
f = open('将进酒.txt')
print(f)
# <_io.TextIOWrapper name='将进酒.txt' mode='r' encoding='cp936'>
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)用于向文件中写入指定字符串,返回的是写入的字符长度。
- fileObject.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符\n。
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()
二、OS模块中关于文件/目录常用的函数
- OS(Operation System)模块:
- 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.rmdir(path)用于删除单层目录。仅当这文件夹是空的才可以, 否则, 抛出 OSError。
- os.removedirs(path)递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。
- os.rename(src, dst)方法用于命名文件或目录,从 src 到 dst,如果 dst 是一个存在的目录, 将抛出 OSError。
- os.system(command)运行系统的shell命令(将字符串转化成命令)
三、序列化与反序列化
- 通过 pickle 模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
- 通过 pickle 模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
- pickle模块中最常用的函数为:
- pickle.dump(obj, file, [,protocol]) 将obj对象序列化存入已经打开的file中。
- obj:想要序列化的obj对象。
- file:文件名称。
- protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。
- pickle.load(file) 将file中的对象序列化读出。
- file:文件名称。
import pickle
dataList = [[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自带的打开文件不可以指定文字编码。
2、编写程序查找最长的单词
输入文档: res/test.txt
题目说明:
“”"
Input file
test.txt
Output file
[‘general-purpose,’, ‘object-oriented,’]
“”"
def longest_word(filename):
# your code here
pass