作业
1、打开中文字符的文档时,会出现乱码,Python自带的打开文件是否可以指定文字编码?还是只能用相关函数?
使用open(path, 'r', encoding = 'utf-8')
来打开文件就可以。中文字符好像默认是用gbk编码方式来读取,所以会报错
2、编写程序查找最长的单词
输入文档: res/test.txt
题目说明:
"""
Input file
test.txt
Output file
['general-purpose,', 'object-oriented,']
"""
def longest_word(filename):
with open(filename, 'r', encoding = 'utf-8') as f:
data = f.read().strip().split('\n')
data1 = ' '.join(data).split(' ')
data1.sort(key = lambda x:len(x))
longest = [i for i in data1 if len(i) == len(data1[-1])]
return longest
In [74]: longest_word('test.txt')
Out[74]: ['general-purpose,', 'object-oriented,']
作业思路:
- 1、首先需要读取文件。函数的输入参数里给了文件名,在函数里使用with的结构去打开并读取文件。由于这里的字符比较混乱,我使用了两层处理。
第一:读取全部数据,用strip()
去除头尾的字符,再用split('\n')
切割每一段。不用readlines()
是因为它读取的结果里还是包含了'\n'
.
第二,用' '.join
的方法重新组合字符串,再进行split(' ')
, 按照空格来切割,得到单个字符。 - 2、找最长的字符串。首先想到的就是排序。但是这里要按照字符串的长度来排序。为了达到这个目的,使用
key
和lambda
函数
data1.sort(key = lambda x:len(x))
key
里返回字符串的len()
,排序结果就是这样 - 3、由于最长的字符串可能不止一个。因此还要判断一下到底有几个是最长的。这里用一个列表推导式来做,加上判断,如果长度和最长的那个一样就保留下来。
文件读取
记住养成用with结构的习惯:
with open('myfile.txt', 'w') as f:
data = f.write()
就是一定会关闭f这个句柄?
记住用中文还是要加一个参数encoding
打开模式 | 执行操作 |
---|---|
‘r’ | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
‘w’ | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑。即原有内容会被删除。如果该文件不存在,创建新文件。 |
‘x’ | 写模式,新建一个文件,如果该文件已存在则会报错。 |
‘a’ | 追加模式,打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
‘b’ | 以二进制模式打开文件。一般用于非文本文件,如:图片。 |
‘t’ | 以文本模式打开(默认)。一般用于文本文件,如:txt。 |
‘+’ | 可读写模式(可添加到其它模式中使用) |
读取方法有read, readline, readlines
read
里可以加参数表示读取几个字符
fileObject.tell()
返回文件的当前位置,即文件指针当前位置。
fileObject.seek(offset[, whence])
用于移动文件读取指针到指定位置。
fileObject.writelines(sequence)
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符\n。
OS 模块
os.getcwd()
用于返回当前工作目录。
os.chdir(path)
用于改变当前工作目录到指定的路径。
操作太多了,也记不住,用的时候再查吧
序列化与反序列化
Python 的 pickle 模块实现了基本的数据序列和反序列化。
通过 pickle 模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
通过 pickle 模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
pickle.dump(obj, file, [,protocol])
将obj对象序列化存入已经打开的file中。
obj:想要序列化的obj对象。
file:文件名称。
protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。