浅谈文件操作

一、初识文件操作

  使用Python对对文件读写,使用open()函数来打开文件,获取文件句柄,而后对文件句柄进行操作,根据打开方式的不同,能执行的操作也有差异

  打开文件的方式有:r,w,a,r+,w+a+,rb,wb,ab,r+b,w+b,a+b,默认使用的是r(只读)模式

二、只读模式(r,rb)

f = open("文件名.txt",mode="r",encoding="UTF-8")
content= f.read()
print(content)
f.close()                        #encoding是选择编码类型,一般选择使用UTF-8
f=open("文件名.txt",mode="rb")#"rb"输出的是bytes类型,不能选择encoding
content= f.read()
print(content)
f.close
#输出的结果是文件中的文件内容所对应的16进制字节

在这里补充一个概念:路径

绝对路径:从磁盘跟目录起一直到文件名

相对路径:相对当前执行的这个程序所在的文件夹而言的路径, "../"表示上一级文件夹

 一般情况,为确保代码的可移植性,通常使用相对路径

  1)read:将文件的内容全部读取出来,但是当遇到较大文件时容易造成内存奔溃

  2)read(n):读取n个字符,需要注意的是,如果再次读取,会从当前位置读取而不是从头读取,使用rb时,读取出来的是几个字节(这里涉及到光标的概念,后文介绍)

  3)readline() :一次读一行数据,但是在读取后的数据结尾都会有一个自动换行,这个时候就需要.strip()方法来去掉空格或\n 

f=open("asd.txt",mode="r",encoding="UTF-8")
content=f.readline()
content2=f.readline()
content3=f.readline()
print(content.strip())
print(content2.strip())
print(content3.strip())    
f.close()

  4)readlines():将文件中的每一行形成一个元素,并放置在列表中。由于也是将文件中的所有文件都读取出来,容易出现内容崩溃的情况

f=open("文件名.txt",mode="r",encoding="UTF-8")
lst=f.readlines()
print(lst)                    
for line in list:
    print(line.strip())    

  5)循环读取的方式,每次只读取一行,不会产生内存溢出的问题

f=open("abc.txt",mode="r",encoding="UTF-8")
for line in f
    print(line.strip())

三、写模式(“w,wb”)

  写文件的时候如果文件存在,则将文件中的内容删除而后写入新内容,如果不存在,就创建该文件

f=open("qwe.txt",mode="w",encoding="UTF-8")
f.write("try it")
f.flush()
f.close()

  在写模式下, 是不能进行读操作的

f=open("asd.txt",mode="wb")
f.write("try everything",encoding="UTF-8")        #在“wb”模式下, 可以不指定文件的编码, 但是在写入时必须将字符串转换为UTF-8数据
f.flush()
f.close()

四、追加模式(a,ab)

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

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

  进入读写模式,程序肯定是先读后写,因为光标是在开头准备读取的,读取完毕后,光标落入结尾,开始写入

f=open("asdasd.txt",mode="r+",encoding="UTF-8")
content=f.read()            #先读
f.write("try")                  #后写
print(content)
f.flush()
f.close()            

如果先写后读,程序会把开头的内容改变成写入的内容而后输出后半部分的内容。

六、写读(w+,w+b)

  先将所有的内容清空,然后写入,最后读取,但是读取的内容是空的。不常用

七、追加读(a+)

  在追加模式下, 无论是先读还是先写,都读取不到数据,追加的内容写在最后

八、其他相关操作

  1、seek(n)把光标移动到 n位置,,移动的是byte,所以中文部分需要移动3的倍数

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)
f.seek(0)         # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close()            

  2、tell()获取光标当前所在的位置

  3、在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显示的是多少. 再写入或者操作文件的时候都是在结尾进行行的操作.所以如果想做截断操作. 记住了了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行行截断,关于truncate(n), 如果给出了了n. 则从开头开头进行行截断, 如果不给n, 则从当前位置截断. 后面的内容将会被删除。

九、文件修改

mport 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", "歌单") # 重命名新⽂文件

 

posted @ 2018-06-08 16:14  Andy_lus  阅读(157)  评论(0)    收藏  举报