人海茫茫
相识真好

决战Python之巅(九)

前言

今天…哦不对,昨天开始了第二模块的学习,导师说很多人在这一模块挂了…嗯-。-加油吧。
模块刚开始讲的是文件操作,我在这里小结一下。

知识回顾

三元运算

在讲文件操作之前先将一个小知识:三元运算。
三元运算又称三目运算,是对简单条件语句的简写,目的是为了让你的代码看起来高大上,让你装…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()

其他方法

决战Python之巅(九)
这里直介绍部分:

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

具体效果大家一试便知。

赞(0) 打赏
未经允许不得转载:老康的学习空间 » 决战Python之巅(九)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏