3.27 day8 文件操作


一,文件操作基本流程

# 流程:打开一个文件,产生一个文件句柄,对文件句柄进行操作,关闭文件
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

#2. 通过句柄对文件进行操作
data=f.read()

#3. 关闭文件
f.close()
护士老师联系方式.txt
参数:1.文件路径。 2.编码方式,encode。以什么方式存储的,就以什么方式打开 3.执行动作(打开方式):只读,只写,追加,读写,写读。。。
f = open('d:\护士老师联系方式.txt',encoding='utf-8',mode = 'r')
content = f.read()
print(content)
f.close()
...

 

二,文件编码

f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8

#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f=open('a.txt','r',encoding='utf-8')

三,文件的打开模式

# f:变量,f_obj,file,f——handler,。。。。文件句柄
# open window的系统功能
# windows默认编码方式:gbk,linux默认编码方式utf-8
# f.close()主动关闭,不让占用内存
# ...

 

文件句柄 = open(‘文件路径’,‘模式’)

读:☑️☑️☑️r只读:
# 对于只读来说,mode可以不写
# 必须有encoding,必须有个编码方式可以是utf-8也可以是gbk
# 注意事项:
# 文件是以什么编码方式存储的,就用什么编码方式打开
# 文件路径:据对路径:d:\护士老师联系方式.txt' 从根目录开始一级一级查找直到找到文件
# 相对路径:在同一个文件夹/目录下直接写文件名即可
# 第一种:r'C:\log.txt' 第二种:C:\\log.txt
# 1-4 的缺点,文件太大占内存
# ☑️☑️☑️五种方式:1.f.read()全部读出来
# 2.f.readline()按行读
# 3.f.readlines()将原文件的每一行作为列表中的元素放入列表中
# 4.f.read(n)按字符读取-老男孩,在rb模式下,按字节读\n是换行符
# 5.👍最好的一种:文件句炳是可迭代对象,读一行占一行内存,只占一行内存,并且全能读出来
f=open('log',encoding='utf-8')
for i in f:
    print(i.strip())
f.close()
#      ☑️☑️☑️rb只读,以bytes类型读取:实际就是010101
# 涉及到非文字类的文件,文件不只含文字,还有图片和视频,不用encoding,mode='rb'

# ☑️☑️☑️r+加了一个写的功能 🏁在读写模式 一定要先读后写 不能先写后读
# f= open('log',encoding='utf-8',mode='r+')
# content = f.read()
# print(content)
# f.write('aaa')
# f.close()

# 🌛写:w
# 1.没有文件会创建一个文件写入内容
# 2.如果是有文件,将原文件内容清空再写入,只能写一次
# f= open('log',encoding='utf-8',mode='w')
# f.write('收拾收拾')
# f.close()

# wb 带b全部不用encoding
# f= open('log',mode='wb')
# f.write('老男孩'.encode('utf-8'))
# f.close()

# w+叫写读模式 用的不多 先写后读 啥也读不出来因为写完之后光标在最后 可以调节光标
# print(f.tell())#按照字节读光标位置
# print(f.seek())#按字节调整光标位置
#
# 🌛追加:a 比w好一些 分已存在文件和不存在文件,没有文件创建文件追加内容,有文件直接追加内容
# f= open('log',encoding='utf-8',mode='a')
# content = f.write('666')
# print(content)
# f.close()

# a+ 追加可读 啥也读不出来因为写完之后光标在最后 可以调节光标 调到seek0

# 其它方法
# f = open('log',encoding='utf-8')
# f.truncate(7)按字节截取的

# 操作方法:
# read
# read(n)
# readline()
# readlines()
# tell()
# seek()
# truncate()
# writable()
# readable()


 功能一:省去自动关闭f.close 功能二:可以一次性操作多个文件巨柄
# import os
# with open('log',encoding='utf-8') as f:
# print(f.read())
# with open('log1',encoding='utf-8') as f1, open('log1',encoding='utf-8') as f2:
# print(f1.read())
# print(f2.write())

# 文件的修改,原字符串不能修改的
# 1.读取原文件,将原文件读取到内存
# 2.在内存中进行修改,形成新的字符串(文件),将新的字符串写入新文件
# 3.将原文件删除
# 4.将新文件重命名成原文件
#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】

#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb 
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

#3,‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】

#4,以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】

四,文件操作方法。

read(3):

  1. 文件打开方式为文本模式时,代表读取3个字符

  2. 文件打开方式为b模式时,代表读取3个字节

其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

注意:

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。

五,文件的修改

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

import os  # 调用系统模块

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #全部读入内存,如果文件很大,会很卡
    data=data.replace('alex','SB') #在内存中完成修改

    write_f.write(data) #一次性写入新文件

os.remove('a.txt')  #删除原文件
os.rename('.a.txt.swap','a.txt')   #将新建的文件重命名为原文件

方法一

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 

方法二

import os
with open('log',encoding = 'utf-8') as f1,\
    open('log_back',encoding = 'utf-8',mode = 'w')as f2:
    for i in f1:
        new_i = i.replace('SB','alex')
        f2.write(new_i)
os.remove('log')
os.rename('log_back','log')

六,当日练习。

1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。

apple 10 3

tesla 100000 1

mac 3000 2

lenovo 30000 3

chicken 10 3

通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。

2,有如下文件:

-------

alex是老男孩python发起人,创建人。

alex其实是人妖。

谁说alex是sb?

你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。

----------

将文件中所有的alex都替换成大写的SB。

with open('log',encoding='utf-8') as f1,\
    open('log_back',encoding='utf-8',mode='w') as f2:
    content = f1.read()
    content = content.replace('alex','SB')
    print(content)

import os
with open('log',encoding='utf-8') as f1,\
    open('log_back',encoding ='utf-8',mode='w') as f2:
    content = f1.read()
    new_content = content.replace('alex','SB')
    f2.write(new_content)
os.remove('log')
os.rename('log_back','log')

 

posted on 2018-03-27 21:12  欣蔚  阅读(146)  评论(0编辑  收藏  举报