day 08 文件操作

一,初识文件操作:

  用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", "哈哈哈") # 重命名新?文件        

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

时间: 2024-10-12 07:30:25

day 08 文件操作的相关文章

08 文件操作

本节主要内容: 1. 初识文件操作 2.只读(r, rb) 3.只写(w, wb) 4.追加(a, ab) 5.r+读写 6.w+写读 7.a+写读(追加写读) 8.其他操作方法(seek(n)光标移动到n位置, tell()获取光标的位置, truncate()截断文件) 9.文件的修改以及另一种打开文件句柄的方式 主要内容:?一. 初识?文件操作使?用python来读写?文件是非常简单的操作. 我们使?用open()函数来打开?一个?文件, 获取到?文件句句柄. 然后通过?文件句句柄就可以进

python之路---08 文件操作

二十六.   文件 f = open(文件路径,mode = '模式',encoding = '编码格式') 1.基础 ① 读写时,主要看光标的位置 ②操作完成要写    f.close( ) f.flush( ) ③f  文件句柄是一个可迭代对象  可用for 循环 ④要用  \n  进行增减空白 2.文件路径 ① 相对路径:.相对于当前程序所在的文件夹,如果在文件夹内,直接写名字 不在时,需要出文件或进文件 文件名 /        进文件 ../            出文件 ②绝对路径:

08文件操作(了解)+出识函数

-----------------------------------01 可读可写.py-----------------------------------#r+t:可读.可写 #w+t:可写.可读with open('b.txt','w+t',encoding='utf-8') as f:# print(f.readable())# print(f.writable())#a+t:可追加写.可读 #r+b#w+b#a+b with open('b.txt',mode='rb') as f:

python note 08 文件操作

1.相对路径与绝对路径比较 #绝对路径 f = open('d:\pzw.txt',mode='r',encoding='UTF-8') content = f.read() print(content) f.close() #相对路径 f = open('pzw',mode='r',encoding='utf-8') content = f.read() print(content) f.close() 2. #对于r就是只读 f = open('pzw',mode='rb',) conten

C语言之文件操作08——总结

C程序的文件操作共涵盖7个例题,包含格式打印,文件读取,条件查找,矩阵的文件操作,数据格式输入及调用计算等内容. 文件操作使得程序有更强的拓展性,使其可以单独保存数据,这为程序的调试和优化打下了坚实的基础,为我们实现大规模计算提供了可能.至此,相信大家对文件操作也有了比较好的认识,无非是写入.读取.调用. 我们常常会听说C的强大,也是因为她有着文件操作的功能,而文件数据是可以方便重写和维护的. MATLAB数学软件是一款十分强大的工具型软件,它是通过C语言来表达算法的,作为面向过程的编程语言C,

C++文件操作(转)

第一个:简单,容易理解,常用:http://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html 第二个:详细的,如下: 文件文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名. 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等.文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来.从不同的角度可对文件作不同的分类.从用户的角度

C文件操作(全)

引用自:http://www.cnblogs.com/whiteyun/archive/2009/08/08/1541822.html 文件 文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等.文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来.从不同的角度可对文件作不同的分类.从用户的角度看,文件可分为普通文件和设备文件两种. 普通文件是

iOS学习之iOS沙盒(sandbox)机制和文件操作复习

1.iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 1.1.每个应用程序都有自己的存储空间 1.2.应用程序不能翻过自己的围墙去访问别的存储空间的内容 1.3.应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行.     通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是

C语言复习——指针 链表 与 文件操作

刚刚进入大二,准备开始学习C++,对大一所学的C语言一次练习,正好也是赶上老师布置的任务,用C语言写一个  销售管理系统  ,就尽可能的把所学的都用上,也就是结构,指针,文件操作,还有数据结构,本次加入了链表. 用两个函数 Load_LinkList() 和 Save_LinkList() 让链表与文件操作结合,除了打印函数,其他都是在内存中操作链表,这样写更有条理,在创建链表时没有采用书上的用一个中间变量引导,并插入到结点前面,而是直接在链表尾的next申请内存,便于理解,操作也方便. /*首