前言
今天…哦不对,昨天开始了第二模块的学习,导师说很多人在这一模块挂了…嗯-。-加油吧。
模块刚开始讲的是文件操作,我在这里小结一下。
知识回顾
三元运算
在讲文件操作之前先将一个小知识:三元运算。
三元运算又称三目运算,是对简单条件语句的简写,目的是为了让你的代码看起来高大上,让你装…13。
例如:
if 条件成立: a = 2 else: a = 3
改成三元运算:
a = 2 if 条件成立 else 3
就这么简单…
文件操作
文件操作无非就是读、写、修改,首先从读开始。
读文件
第一种模式
f = open(file = 'python.txt',mode = 'r',encoding='utf-8') data = f.read() f.close()
- file = ‘python.txt’ 表示文件路径
- mode =‘r’ 表示只读模式(可修改)
- encoding= ‘utf-8’表示将硬盘上的10101010用utf-8的规则去‘断句’,‘断句’之后再将10101010转换成unicode
- f.read()表示读取文件所有内容,内容是已经转换过的字符串
- f.close()表示关闭文件
第二种模式
f = open(file = 'python.txt',mode = 'rb') data = f.read() f.close()
这里的mode变成了‘rb’表示读出来所有的内容,都是硬盘上保存的,表示这个文件内容的01010101。
这两种模式有何区别呢?你会注意到,第二种模式没有encoding,’rb’是指以二进制的模式读,数据从硬盘上读到内存里直接是bytes模式,如果你想知道确切内用而不是一堆010101,则需要你手动decode,因此在文件打开阶段,不需要指定编码。
第一种模式中,我们需要指定某种编码,某种与处理文件时用的一样的编码。那万一我们不知道处理文件用的什么编码怎么办?
import chardet f = open('python.txt',mode = 'rb') data = f.read() f.close() result = chardet.detect(open('python.txt',mode = 'rb').read()) print(result)
这里需要调用到其他模块chardet。
那么,这么多行文件,我不想一次性全都读出来,我想一行一行读出来,怎么办?
使用循环:
f = open(file = 'python.txt',mode = 'r',encoding='utf-8') for line in f: print(line) f.close()
这里你会发现,下面一行总是另起一行开始。
Why?
因为每次print之后,后面会自动加上一个换行符。
写文件
写文件其实和读文件差不多,只不过是:
f = open(file = 'python.txt',mode = 'w',encoding='utf-8') f.write("你要写的内容") f.close()
- 把mode换成了w,即write
- f.read()换成了f.write()
- 这里的encoding
- 表示的是将写入的unicode字符串编码成utf-8格式
当你事过之后你会发现,每次写之后,之前的内容没有了,文件里只有你的新内容,why?
其实这个‘写’的流程是,先判断这个文件在当前路径下存不存在,存在就清空写入新内容,不存在就新建一个文件并写入内容。
同样也有二进制写法,wb。
追加
即把内容追加到文件尾部:
f = open(file = 'python.txt',mode = 'a',encoding='utf-8') f.write("你要写的内容") f.close()
- mode= ‘a’ 表示append,追加。
- 同样是要写进去,所以还是f.write()
- 切记,一定要f.close()才能看到文件中写入的内容。
读写混合模式
如果你想先把文件内容读出来看一下,然后再写,那就是用读写混合模式:
f = open('python.txt', 'r+','utf-8') data = f.read() print(data) f.write("你要写的内容") f.close()
其他方法
这里直介绍部分:
- flush:上面说过,无论是写还是追加,一定要关闭文件后再能看到是否写成功,为什么呢?因为每次写文件时,你需要写入的内容其实都是先存到一个buffer即缓存中,当你关闭文件后,文件内容才会从缓存中写到硬盘里。这样就有一个风险,就是说万一有一天你在写很重要的内容,写着写着,咔停电了,那缓存中的东西就都没了。那怎么办?稳妥一点就是边写边存,一遍写到缓存中,一遍强制内容从buffer中刷新到硬盘里,这就是flush。
f = open(file = 'python.txt',mode = 'w',encoding='utf-8') f.write("你要写的内容") f.flush() # 这里文件没有关闭,你还可以继续写而不用重新打开文件
- readable、writeable:很简单,判断文件是否可读可写,主要是在linux中用到。
- readline:读文件时只读一行,遇到换行符停止
- seek、tell:在讲这两个之前先说一下,其实每次打开文件,都有一个隐形的光标,默认位置0即在文件内容头,当你读完一个文件,再读一次时你会发现读出来的是空的,因为这时候光标已经移动到文件内容最后,再往下读什么也没有,所以返回空。而tell的作用就是告诉我们这个光标现在在什么位置,seek是将光标移动到指定的位置,注意这里的位置是按字节算的,假如是unicode编码,一个汉字占两个字节,想移动过一个汉字,就是seek(2),不同编码中字符占的字节数不一样,seek的参数就要赋不同的值,否则会报错或者乱码,切记。
- truncate:不指定参数,就去除当前光标到文件末尾内容;指定参数,就保留从文件头开始,指定长度的内容,其他的全部去除。
修改
修改有两种方法:
占内存法:
这种方法是将文件内容全部读到内存里以后,再修改,然后将修改后的内容重新写入原文件。
f = open('python.txt', 'r+','utf-8') data = f.read() print(data) data.replace('原内容',‘新内容’) f.write(data) f.close()
占硬盘法:
这种方法是将内容一行一行读出来,修改后写到一个新的文件中去:
f = open('old_python.txt', 'r','utf-8') f_new = open('new_python.txt', 'w','utf-8') for line in f: if 'old_str' in line: line = line.replace('old_str','new_str') f_new.write(line) f.new.close() f.close()
具体效果大家一试便知。