day5-python的文件操做-坚持就好

目录摘要python

文件处理windows

1.文件初识ide

2.文件的读操做函数

3.文件的写操做编码

4.文件的追加操做spa

5.文件的其余操做操作系统

6.文件的修改指针

 

 

正式开始code

文件处理:写了这么多代码了,有的时候咱们执行完成的结果想永久保存或者是保存后方便下一次在调用,对于文件的主要操做就是读,写以及追加了。视频

1.文件初识

如今咱们有一个文件,如今经过python代码打开这个文件,而打开这个文件,就有了必须的三要素

path:文件的路径

mode:操做类型,r w r+ w+ a……

encoding: 编码类型 通常的unicode gbk gb2312等

通常读取的时候报错的缘由:

  1.1 路径错误:\与后面的那个字符具备了特殊意义。

  解决办法:

    r’d:\test文件.txt’在路径最前方加r,代表这个是一个完整的路径

    ‘d:\\test文件.txt’对第一个\进行转义,代表他是一个\

  1.2 unicodedecodeerror:编码错误

    打开文件的编码与文件的编码不一致

  1.3 encoding只是声明了这个文件须要用什么编码编译

  1.4 路径

    绝对路径:从磁盘根目录开始,找到文件的具体路径。

    相对路径:从当前路径(当前文件夹)找到的文件的路径

2.文件的读操做

  2.1 文件读操做的定义与基本解释,具体查看下方示例

示例一:

f = open(file='D:\pycharm\全栈三期\day6\做业.txt',mode='r',encoding='utf-8')
data = f.read()
f.close()
#上述就是一个文件读取最完整的表述
f f1 file file_handle f_h等,都称之为文件句柄
open() python的内置函数,可是其实是调用的操做系统对文件操做的功能#windows默认是GBK编码,Linux与MACos 默认使用utf-8编码
####对文件的任何操做都是借助文件句柄进行操做####
file= '文件的绝对路径'
mode ='对于文件的操做模式'
encoding = '文件的编码格式',此处的encoding必须和文件写入时的文件编码格式一致,要否则就会报错
#而后将读取的文件的内容赋值给一个变量
#!!!!#
很重要的是对于一个文件操做后必定要对文件关闭,必定要关闭文件句柄

  2.2 ’r‘的五种读取方式

  2.2.1 r.read()所有读出来

f1 = open('做业.txt','r',encoding='utf-8')
data = f1.read()
print(data)
f1.close()
#结果
咱们的做业啊~~~~~!
咱们的做业还有不少!!!
#所有读取出来

  2.2.2 r.read(n)读几个字符

f1 = open('做业.txt','r',encoding='utf-8')
data = f1.read(3)
print(data)
f1.close()
#结果
咱们的
#咱们会发现输入3并非读取三个字节,而是三个字符

  2.2.3 r.readline()读一行

f1 = open('做业.txt','r',encoding='utf-8')
print(f1.readline())
print(f1.readline())
f1.close()
#结果
咱们的做业啊~~~~~!

咱们的做业还有不少!!!
#这样就是一行一行读取,不过一行只能读取一次

  2.2.4 r.readlines()所有读取,返回一个列表

f1 = open('做业.txt','r',encoding='utf-8')
data = f1.readlines()
print(data)
f1.close()
#结果
['咱们的做业啊~~~~~!\n', '咱们的做业还有不少!!!']
#会发现生成的文件句柄是一个列表,而后循环这个文件,就会逐行打印

  2.2.5 for循环的读取

f1 = open('做业.txt','r',encoding='utf-8')
for line  in f1:
    print(line)
f1.close()
#结果
咱们的做业啊~~~~~!

咱们的做业还有不少!!!

 

总结:文件读取有以上五种状况,不过对于前四种,若是文件比较小,则使用前四种一点问题都没有,但是若是是一个大文件读取,一次性读取一个大容量文件,内存绝对会撑爆,对于这种文件操做,通常是将文件生成一个迭代器,一行一行的去读取,这样内存占用就会小不少了。

  2.3 rb模式

  对于rb,咱们须要知道一点,b模式操做的文件是非文字类的文件:图片,音频,视频等

f = open('做业.txt','rb')
data = f.read()
print(data)
#结果
b'\xe6\x88\x91\xe4\xbb\xac\xe7\x9a\x84\xe4\xbd\x9c\xe4\xb8\x9a\xe5\x95\x8a~~~~~\xef\xbc\x81\r\n\xe6\x88\x91\xe4\xbb\xac\xe7\x9a\x84\xe4\xbd\x9c\xe4\xb8\x9a\xe8\xbf\x98\xe6\x9c\x89\xe5\xbe\x88\xe5\xa4\x9a\xef\xbc\x81\xef\xbc\x81\xef\xbc\x81'
#生成的结果就是上面这么一串字符串
f = open('做业.txt','rb')
data = f.read(3)
print(data)
f.close()
#结果
b'\xe6\x88\x91'

  由上面这个示例,能够看出,

  在r模式下,read(n)是按照字符来移动

  在rb模式下,read(n)就是按照字节来移动,并非字符了

  rb的格式是以二进制的方式的读取文件,文件在硬盘中存储方式为010101010,则rb就是将文件安装二进制的方式读取出来,若是须要转换在使用encoding进行编码

  2.4 r+读写模式

  对于读写模式,咱们能够理解为先读后写,在追加

f1 = open('做业.txt','r+',encoding='utf-8')
data = f1.read()
f1.write('今天还要加油鸭!')
print(data)
f1.close()

结果为

image

若是咱们非要先写后读呢,看示例

f1 = open('做业.txt','r+',encoding='utf-8')

f1.write('今天还要加油鸭!')
data = f1.read()
print(data)
f1.close()

结果呢就变成下面这个样子

image

和上面的相比,咱们写的内容就会覆盖文件中第一行,并无起到追加的效果,这个时候就须要一个提到一个指针的概念,这个在后面文件的其余应用中说明。须要谨记的是在r+模式中,应该先读在写的

3.文件的写操做

  3.1 w操做

  这个时候你必定要记得,w就是就将文件从新写一遍,之前的内容所有都没有了!!!!

  文件的写操做,是没有文件则建立文件,有文件则会先清空内容在写入新内容

  w模式下,必须是以字符串的内容写入,不过须要记住的是文件的写操做是能够持续写的

#第一种
f = open(file='做业.txt',mode='w',encoding='utf-8')
f.write('咱们的做业啊~~~~~!')
f.close()
#file= '文件打开的相对路径'
#mode = '打开的文件方式为写'
#encoding ='编码格式'
#第二种
f1 = open('做业.txt','w',encoding='utf-8')
f1.write('我爱写做业')
f1.write('我爱写做业')
f1.write('我爱写做业')
f1.write('我爱写做业')
f1.write('我爱写做业')
f1.write('苦笑!')
f1.close()

运行结果就是这样子,之前的内容所有都没有了,慎重使用

image

注意:

文件操做时,以 “w”或“wb” 模式打开,则只能写,而且在打开的同时会先将内容清空。
写入到硬盘上时,必须是某种编码的0101010,打开时须要注意:
wb,写入时须要直接传入以某种编码的0100101,即:字节类型
w 和 encoding,写入时须要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010

  3.2 wb操做

  rb和wb通常都是用在非文本的文件中,例如图片,音频和视频等

f = open('百度.jpg','rb')
coment = f.read()
f.close()
f1 = open('百度1.jpg','wb')
f1.write(coment)
f1.close()
#结果会看到在相同文件中看到同样的图片

  3.3 w+操做

  w+操做就是写读模式

f1 = open('做业.txt','w+',encoding='utf-8')
f1.write('啊啊啊啊啊啊啊~~~')
f1.write('啊啊啊啊啊啊啊~~~')
f1.write('啊啊啊啊啊啊啊~~~')
f1.write('啊啊啊啊啊啊啊~~~')
f1.seek(0)
print(f1.read())
#结果
啊啊啊啊啊啊啊~~~啊啊啊啊啊啊啊~~~啊啊啊啊啊啊啊~~~啊啊啊啊啊啊啊~~~

#就会发现,会先将以前的文件所有清空,清空后再赋值,而后将光标放在第一位,才能读取出来,这个通常真的不用

4.文件的追加操做

输出结果

f = open(file='做业.txt',mode='a',encoding='utf-8')
f.write('\n咱们的做业还有不少!!!')
f.close()
#文件的追加,就是在文件的最后一行追加一行,并不改变文件自己的内容

用追加模式,没有文件则建立文件追加内容,有文件的则会在文件的末尾追加内容

注意:
文件操做时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容
写入到硬盘上时,必须是某种编码的0101010,打开时须要注意:
ab,写入时须要直接传入以某种编码的0100101,即:字节类型
a 和 encoding,写入时须要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010

5.文件的其余操做

  readable writeable 判断一个句柄是否可读,可写

f = open('做业.txt','w',encoding='utf-8')
print(f.readable())
print(f.writable())
#结果
False
True
#返回的是布尔值

  seek tell 将光标移动到一个特定的位置   判断一个文件如今光标的位置

f = open('做业.txt','r+',encoding='utf-8')
print(f.read())

f.seek(3)#指针迁移是按照字节迁移,由于用utf-8编码,因此一个字符就是三个字节
print(f.read())
f.seek(0,2)#将指针末尾
print(f.tell())
f.close()

#结果
凉州词
黄河远山白云间
一片孤城万仞山
羌笛何必怨杨柳
春风不度玉门关
州词
黄河远山白云间
一片孤城万仞山
羌笛何必怨杨柳
春风不度玉门关
101#光标位置

  flush 将内存中的内容强制刷新到磁盘内

f2 = open('file4',encoding='utf-8',mode='w')
f2.write('老男孩教育是最好的学校')
f2.flush() # 强制保存 至关于ctrl + s
f2.close()

  trunkcate 在可写的模式下,截取原文件,只能从头截取,不能调整光标去截取一部分

# f2 = open('file4',encoding='utf-8',mode='w')
# f2.write('老男孩教育是最好的学校')
# f2.flush() # 强制保存 至关于ctrl + s
# f2.close()

# 不能在w模式下使用truncate
# f1 = open('file4', encoding='utf-8',mode='w')
# f1.truncate(6)
# f1.close()

  补充用法:若是不知道文件的编码格式,也能够,不过这个时候须要导入其余模块

f = open('做业.txt',mode='rb')
data = f.read()
f.close()

result = chardet.detect(data)
print(result)
#结果
{'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
#其中confidence:1.0 表示100%确定为utf-8编码的文件

#简单的文本文档逐行打印
f = open('做业.txt',mode='r',encoding='utf-8')
for line in f:
print(line)

6.文件的修改

  6.1 文件打开的另外一种方式

除了上文中的打开方式以外,还有另一种方式,相比于上面的方式,有一些其余的特色:

  • 自动关闭文件的句柄
  • 同一语句能够操做建立多个文件句柄
with open('做业.txt','r',encoding='utf-8')as f1, \
    open('百度.jpg','rb',):
    for line in f1:
        print(line.strip())
#结果
凉州词
黄河远山白云间
一片孤城万仞山
羌笛何必怨杨柳
春风不度玉门关

虽然用with是能够自动关闭文件句柄,若是持续将一个文件产生俩次文件句柄,颇有可能发生IO错误,仍是须要谨记的。

  6.2 文件的修改

现有的文件编辑软件,例如office,wps这些文本操做软件他们对于文件编辑的操做方式以下

  1. 以读的模式打开原文件,产生文件句柄f1
  2. 以写的模式打开新文件,产生文件句柄f2
  3. 读取原文件,将原文件的内容改写至新文件内
  4. 删除原文件
  5. 将文件重命名为原文件

现有这么案例,将文本中’alex‘所有改写为’SB’:

log内

alex是老男孩python发起人,建立人。
alex实际上是人妖。
谁说alex是sb?
大家真逗,alex再牛逼,也掩饰不住资深屌丝的气质。

方式一:

import os
with open('log','r',encoding='utf-8')as f1,\
    open('log.bak','w',encoding= 'utf-8')as f2:
    old_data = f1.read()
    new_data = old_data.replace('alex','SB')
    f2.write(new_data)
os.remove('log')
os.rename('log.bak','log')

#结果
SB是老男孩python发起人,建立人。
SB实际上是人妖。
谁说SB是sb?
大家真逗,SB再牛逼,也掩饰不住资深屌丝的气质。

方式二:升级一下,如今文件内容比较少,若是内容多了额,一下就撑爆内存了,改进下,用for循环的方式

import os
with open('log','r',encoding='utf-8')as f1,\
    open('log.bak','w',encoding='utf-8')as f2:
    for line in f1:
        line = line.replace('alex','SB')
        f2.write(line)
os.remove('log')
os.rename('log.bak','log')
#结果
SB是老男孩python发起人,建立人。
SB实际上是人妖。
谁说SB是sb?
大家真逗,SB再牛逼,也掩饰不住资深屌丝的气质。
对于大文件仍是推荐这么用,不过对于小文件就无所谓了,反正也占用不了太多内存

 

最后总结一下,对于文件操做是python中的一种基本操做,其中,主要用r r+ 其次用rb w wb a

带b的模式都是操做非文本类的文件,例如图片音频和视频

文件操做中比较经常使用的为readable writable flush tell seek