第二模块:python学习之文件操作

python中的文件操作

1.文件的读取,r与rb的区别

看以下代码

file = open('test','r',encoding='UTF-8')
data = file.read()
file.close()

看第一行代码中,open是文件打开的函数,有三个参数,第一个'test'代表的是文件名,可以是相对路径也可以是绝对路径,第二个参数'r'代表的是文件的打开方式,本例是只读的方式,还可以用其他的方式,例如‘w’、‘r+’、‘a’等,第三个参数encoding='UTF-8'代表这个文档的编码格式为utf-8。

第二行代码中,一次性全部读取文件赋值给data,数据此时还在内存中

第三行代码中,对于每一个文件读取的时候都需要读取完毕的时候都需要将文件关闭

看以下代码

file = open('test','rb')
data = file.read()
file.close()

与上面代码最大的区别就是r与rb的区别,其中rb直接读取硬盘中文件0101010的格式,而r会按照默认的编码格式去读取数据

对上面俩个代码分别print就可以看到很大的区别

rb形式读取

b'\xe7\xbe\x8e\xe5\xa5\xb3\xe5\x95\x8a\r\n\xe5\xa4\xa7\xe7\xbe\x8e\xe5\xa5\xb3\xe5\x95\x8a\r\n\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88\r\n

是按照16进制读取的

r形式读取

美女啊
大美女啊
哈哈哈哈

不过需要在分清上述俩个形式之外,需要知道不管r还是rb都只能对文件读取,并不能对文件写入哈。

2.文件的循环

看以下代码

file = open('test','r',encoding='utf-8')
data = file.readlines()
for i in data:
print(i)
file.close()

其实就是一个for循环,不过read和readlines的区别后面再说

3.文件的写,w与wb的区别

看以下代码

file = open('test2','w',encoding='utf-8')
file.write("我在写文件,now")
file.close()

第一行相比于第一个代码,最大的区别就是在第二个参数的区别,w就是write的意思

第二行就是我在这个文件中写入我的测试语句

第三行还是对文件日常关闭

在文件写方面需要注意的是,w会将问将文件全部清除掉在重新写进去,所以就会造成数据的丢失,谨慎使用,还有一点的是如果要写的文件不存在,则会创建这个文件,所以有的时候用于判断文件是否存在,不存在则创建一个文件

关于w与wb的区别呢,则是,w则是按照默认的或者某种编码格式转换成特定的010101数据写入到硬盘,而wb则是直接按照某种格式直接写入01010101数据

4.文件的追加

文件的追加就是说在文件的末尾添加一行数据

看以下代码

file = open('test2','a',encoding='utf-8')
file.write("\n我在写文件,now2")
file.close()

与之前的代码最大的区别就是第二个参数变为a,文件在追加前的显示如下

我在写文件,now

文件追加后

我在写文件,now
我在写文件,now2

需要注意的是对于追加同样也有a与ab的区别,不过同样和上面一样,要吗按照指定的编码格式转换成特定的010101写入文件,要吗就是直接按照二进制的形式写入进去

5.r+与w+的区别

对于文件的操作在上面的一些还有俩个其他的操作

对于W+按照他的格式就是说可写也可读

代码如下

file = open('test2','w+',encoding='utf-8')
file.write("我在写文件,1\n")
file.write("我在写文件,2\n")
file.write("我在写文件,3\n")
file.close()

代码执行前文本文档

我在写文件,now
我在写文件,now2

代码执行后的文本文档

我在写文件,1
我在写文件,2
我在写文件,3

注意点是w+之后文件虽然可以读了但是还是会执行w的特性,会把文件清空,所以日常情况用的比较少

对于r+可以理解为可读也可写,在可读的基础上也可写

看以下代码

file = open('test2','r+',encoding='utf-8')
file.write("我在写文件,5\n")
file.close()

可以发现在读取的同时也可对文件进行写操作,这个时候会发现,文本默认的追加在文件末尾了,那是因为文件在读取结束后光标移动到文件末尾,默认的从结尾处追加。关于r+使用的情况还是比较常见的。面对这个特性,有些人会认为既然这样,那我把光标移动到一定的位置,可读也可写那意味着文件是否可以修改了,代码如下

file = open('test2','r+',encoding='utf-8')
file.seek(8)
file.write("我在写\n")
file.close()

可以发现结果如下

我在�我在写

我在写文件,2
我在写文件,3

出现这个情况的原因是,对于硬盘,文件的空间是指定大小了,虽然我们可以移动光标选择我们要修改的位置,但是由于一些情况还是会造成乱码,谨慎使用,一般建议不使用

6.其他操作

def fileno(self, *args, **kwargs): # real signature unknown
        返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到
def flush(self, *args, **kwargs): # real signature unknown
        把文件从内存buffer里强制刷新到硬盘(注意这个,有些情况还是使用量较大,有些文件需要实时的刷入文件,就需要调用这个方法)
def readable(self, *args, **kwargs): # real signature unknown
        判断是否可读
def readline(self, *args, **kwargs): # real signature unknown
        只读一行,遇到\r or \n为止
def seek(self, *args, **kwargs): # real signature unknown
        把操作文件的光标移到指定位置
        *注意seek的长度是按字节算的, 字符编码存每个字符所占的字节长度不一样。
        如“路飞学城” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“飞”和“学”两个字中间。
        但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节
def seekable(self, *args, **kwargs): # real signature unknown
        判断文件是否可进行seek操作
def tell(self, *args, **kwargs): # real signature unknown
        返回当前文件操作光标位置 
def truncate(self, *args, **kwargs): # real signature unknown
        按指定长度截断文件
        *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。
def writable(self, *args, **kwargs): # real signature unknown
        判断文件是否可写

7.read,readline以及readlines的区别

read:对于read如果读取一个文件,他会一次性将整个文件读取到内存空间中,整个文件是str类型,对于目前所使用的文件比较小可以使用,对于文件大不建议

readline:对于readline只读取文件的一行,遇到换行符tab等中断,通常也是读取到的一行内容放到一个字符串变量中,返回str类型

readlines:对于readlines()每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回list类型代码如下

file = open('test','r+',encoding='utf-8')
data = file.readlines()
for i in data:
print(i)
file.close()
print(type(data))

结果:<class 'list'>

可以很清楚的看到readlines的类型为列表

8.练习题以及答案

练习题1 —— 全局替换程序:

  • 写一个脚本,允许用户按以下方式执行时,即可以对指定文件内容进行全局替换

      `python your_script.py old_str new_str filename`
    
  • 替换完毕后打印替换了多少处内容

代码如下

练习题2 —— 模拟登陆:

  • 用户输入帐号密码进行登陆
  • 用户信息保存在文件内
  • 用户密码输入错误三次后锁定用户,下次再登录,检测到是这个用户也登录不了

代码如下

猜你喜欢

转载自www.cnblogs.com/gbq-dog/p/8919553.html