码迷,mamicode.com
首页 > 其他好文 > 详细

day 08 文件操作

时间:2018-06-08 18:29:19      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:多少   修改   元素   外部   列表   中间   字符串   字节   弊端   

一,初识文件操作:

  用open()来打开一个文件,获取到文件句柄,然后通过文件句柄进行各种操作,需要注意的是读取完的文件句柄一定要关闭,使用 f.close()

  开?文件的?方: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 认使?用的是r()模式

二,只读操作:

  1. r :只读模式

建一个文件名为"哈哈哈"的文件,然后读一下:

 

f = open("哈哈哈",mode="r",encoding="utf-8")  #此处的f是句柄,encoding表示编码集,根据文件的实际保存编码进行获取数据
content = f.read()
print(content)
f.close()
#运行结果为:
#哈哈哈
#lalala
#呵呵呵     这是我写在"哈哈哈"文件里面的内容

 

 

 

  2.rb:读取字节,在读取非文本文件,比如MP3,图像,视频等信息的时候可以用到,文件上传下载也可以用到

 

f = open("哈哈哈",mode="rb")   #在rb模式下,不能选择encoding
content = f.read()
print(content)
f.close()
#结果为:  b‘\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88\nlalala\n\xe5\x91\xb5\xe5\x91\xb5\xe5\x91\xb5‘
#因为rb模式下读取的是byte类型,所以会显示为字节

 

#返回上一级文件使用../,如果需要返回多层,增加使用../就可以了

 

绝对路径和相对路径:

  1.绝对路径:从磁盘根目录开始一直到文件名

  2.相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言,如果在同一个文件夹中,相对路径就是这个文件名,如果在上一层文件夹,则返回上一级文件使用../,如果需要返回多层,增加使用../就可以了

#推荐使用相对路径,在把程序copy给别人使用的时候,直接把项目copy走就可以运行了,但是使用绝对路径的话,还要把外部建的文件一起copy.

 

读取文件的方法:

  1.read()  将文件中的内容全部读出来,弊端是占内存,如果文件过大的话,容易导致内存崩溃

f = open("哈哈哈",mode="r",encoding="utf-8")
content = f.read()
print(content)
f.close
# 哈哈哈 # lalala # 呵呵呵

  2.read(n) 读取n个字符,如果再次读取的话,会在当前位置继续读,而不是从头读,如果使用的事rb模式的话,读取出来的是n个字节

f = open("哈哈哈",mode="r",encoding="utf-8")
content = f.read(6)
print(content)
f.close
# 哈哈哈 回车键也算一个字符,所以上面打印的是6个字符,出来的是五个字 # 咯咯
f = open("哈哈哈",mode="rb")
content = f.read(6)
print(content)    #b‘\xe5\x93\x88\xe5\x93\x88‘  打印出的是6个字节
f.close
f = open("哈哈哈",mode="r",encoding="utf-8")
content = f.read(2)
content1 = read(2)
print(content)
print(content1)
f.close
#哈哈 #哈 因为我在创建文件的时候使用了回车键,所以回车键也算一个字符,所以第二个是一个"哈"字

  3. readline() 一次读取一行数据,需要注意的是:readline()结尾,每次print都会默认有一个\n (换行),需要我们使用 .strip()的方法来去掉\n

f = open("哈哈哈",mode="r",encoding="utf-8")
content = f.readline()
content1 = f.readline()
content2 = f.readline()
print(content)
print(content1)
print(content2)
f.close()
# 结果为
#哈哈哈
#
#lalala
#
#呵呵呵
#            此处三行空,就是print默认的\n

  4.readlines() 将每一行形成一个元素,放到一个列表中,把所有的内容读出来,但是容易出现内存崩溃的问题,不推荐使用

f = open("哈哈哈",mode="r",encoding="utf-8")
lst = f.readlines()
print(lst)           #[‘哈哈哈\n‘, ‘lalala\n‘, ‘呵呵呵‘]
for line in lst:    # 循环列表
    print(line.strip())   #打印去掉\n的结果
f.close
#哈哈哈 #lalala #呵呵呵

  5.循环读取:这种方式是最好的,每次读取一行内容,不会产生内存溢出的问题

f = open("哈哈哈",mode="r",encoding="utf-8")
for line in f:
    print(line.strip())   #如果不用strip的话,会出现空行
f.close()

 

三.写模式(w,wb)

执行写模式的时候,如果没有这个文件,则会创建出这个文件,如果存在这个文件,则将原文件的内容删除,再写入新的内容

f = open("哈哈哈",mode="w",encoding="utf-8")
f.write("神经病啊")
f.flush()    #刷新
f.close()
#执行完后,"哈哈哈"文件里面的内容更换为"神经病啊"

在w模式下,不可以执行读操作

在wb模式下,可以不指定打开文件的编码(encodeing),但是在写文件的时候必须将字符串转化成utf-8的bytes数据

f = open("哈哈哈",mode="wb")
f.write("你神经病啊".encode("utf-8"))
f.flush()    #刷新
f.close()
#执行完后,"哈哈哈"文件里面的内容更换为"神经病啊"

 

四,追加(a,ab)

  在追加模式下,我们写入的内容会追加在文件内容的结尾

f = open("哈哈哈",mode="a",encoding="utf-8")
f.write("你就是神经病")
f.flush()
f.close()
# 你神经病啊你就是神经病

 

五,读写模式(r+,r+b)

  使用读写模式的时候,必须要先读,因为默认光标是在开头的,读完了之后再进行写入,就会在正常读取后,在文件内容的后面写入.r+ 是我们以后使用频率最高的

  不要先写后读,如果先写得话,会把开头的内容更改为你重新写入的内容,这样容易出错

f = open("哈哈哈",mode="r+",encoding="utf-8")
content = f.read()
f.write("hahahahahahha")
print(content)
f.flush()
f.close()     #读取完成后,在结尾写入

 

六,写读(w+,w+b):先将所有的内容清空,然后写入,最后读取,但是因为光标在最前面,座椅读取的内容是空的,不常用,也不可以先读,w+模式下,一开始就读不到数据,然后写的时候再将原来的内容清空,所以很少用

七, 追加读(a+): 在a+模式下,不论先读还是后读,都是读取不到数据的.

八,其他相关操作:

  1.seek(n)  光标移动到n位置,

    注意:移动的单位是byte,所以如果是utf-8的中文部分要是3的倍数

  通常我们使用seek的时候都是移动到开头或者结尾

    移动到开头:seek(0)

    移动到结尾:seek(0,2)  seek的第二个参数表示的是从哪个位置进行便宜,默认:0表示开头,1表示当前位置,2表示结尾

f = open("哈哈哈",mode="r+",encoding="utf-8")
f.seek(0)    #光标移动到开头
content = f.read()   #读取内容,此时光标从开头移到结尾,将内容读出来
print(content)
f.seek(0)     #光标移到开头
f.seek(0,2)   #光标移到结尾
content2 = f.read()  #什么都读不到,因为上面已经把光标移到了结尾
print(content2)
print(f.tell())    #打印光标位置
f.seek(0,1)    #当前位置
print(f.tell())    #打印光标位置,跟上面是一样的,所以光标位置没有发生改变
f.write("张国荣")   #在结尾处写入了
f.flush()
f.close()

  2.tell()  获取当前光标在什么位置,上面已经示例,可以看一下

  3.runcate()  截断文件

f = open("哈哈哈",mode="w",encoding="utf-8")
f.write("哼哼")  #写入这两个字
f.seek(3)     #将光标移到3,也就是这两个字的中间
f.truncate()  #删掉光标后面的所有内容
f.close()    
#结果是  只有一个字  哼
f = open("哈哈哈",mode="r+",encoding="utf-8")
content = f.read(3)    #读到第三个字符
f.seek(9)      #只能写3的倍数
print(f.tell())  #打印光标位置
f.truncate()     #删除后面的内容
f.flush()
f.close()

 

  注意:在r+模式下,如果读取了内容,不论读取内容多少,光标显示的是多少,再写入或者操作文件的时候都是在结尾进行操作的

   如果想做截断操作,要先挪动光标,挪到你想要截断的位置,然后再进行截断

九:文件修改以及另一种打开文件的方式

  文件修改:只能讲文件中的内容读取到内存中,将信息修改后,然后把原文件删除,把新文件的名字改成原文件的名字

可以不关文件,过一段时间会自动关闭

import os
with open("哈哈哈",mode="r",encoding="utf-8") as f1,    open("哈哈哈_new",mode="w",encoding="utf-8") as f2:    #打开文件,如果不存在会创建
    content = f1.read()   #读取原文件
    new_content = content.replace("西瓜","草莓")  #把西瓜改为草莓
    f2.write(new_content)    #把更改后的写入新文件
os.remove("哈哈哈")     #删除原文件
os.rename("哈哈哈_new","哈哈哈")  #把新文件名字改为原文件的名字

但是这种方法有个弊端,会一次将所有的内容进行读取,内存会溢出,

解决方法:用for循环一行一行的读取和操作

 import os
with open("哈哈哈", mode="r", encoding="utf-8") as f1,\ 
       open("哈哈哈_new", mode="w", encoding="UTF-8") as f2:
    for line in f1:         #循环原文件
        new_line = line.replace("草莓", "西瓜")   #原文件里面更改赋值给新文件里面的内容
        f2.write(new_line)    #把更改过的新文件内容写入新文件
os.remove("哈哈哈") # 删除源?文件 
os.rename("哈哈哈_new", "哈哈哈") # 重命名新?文件        

 

day 08 文件操作

标签:多少   修改   元素   外部   列表   中间   字符串   字节   弊端   

原文地址:https://www.cnblogs.com/lianghui-lianghui/p/9157015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!