首页 > 代码库 > 文件操作

文件操作

一、对文件的操作流程

  1、打开文件,得到文件句柄(作用就好像锅把手)并赋值给一个变量

  2、通过句柄对文件进行操作

  3、关闭文件

  即:1、打开文件  open()

    2、操作文件  read()write()

             data=http://www.mamicode.com/f.read(5)#5指的是指定个数的字符,从光标所在位置算起

             data=http://www.mamicode.com/f.readlines()#拿到列表结果,带换行符从光标所在位置算起

    3、关闭文件  close()

注意如果在Windows系统中,hello文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而Windows操作系统默认的是gbk编码,所以直接打开会乱码,需要f=open(‘hello‘,encoding=‘utf8‘),hello文件如果是gbk保存的,则直接打开即可。

  4、读操作(r)写操作(w,r)都是对字符进行操作

#r读操作
f = open("test",encoding="utf-8") #打开文件 data = http://www.mamicode.com/f.read()#获取文件内容"".join([line.strip(),"岳飞"]) print(line.strip()) count+=1 count=0 for line in f: if count == 2 : line = "".join([line.strip(),"sdf"]) print(line.strip()) count+=1
#w,写操作,覆盖加
f = open("test",mode="w",encoding="utf-8") #打开文件
f.write("hello")#覆盖写,把原来的东西覆盖掉
f.write("hello\nworld")#在文件没有关闭之前,可以可以继续追加
#a,写操作,追加
f = open("test",mode="w",encoding="utf-8")
f.write("hello")#追加写,在原来的东西后面写

  5、flush操作(进度条)

方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。

#语法
f.write("hello tests")
f.flush()#用于做进度条
#进度条简单版
import sys
for i in range(100):
    sys.stdout.write("#")#是一个文件,相当于屏幕,平时用到的print就是用stdout写的
    sys.stdout.flush()
    import time
    time.sleep(0.5)
#进度条优化版
import sys
for i in range(100):
  s="\r%d%% %s"%(i,"#"*i)#"#"后边乘以3代表"###",这也是一种拼接方式
  sys.stdout.write(s) #\r表示让光标回到行的开头
  sys.stdout.flush()
  import time
  time.sleep(0.5)

  6、可读可写模式:r+,w+,a+

#r+
f=open("test","r+",encoding="utf-8")
print(f.read())
f.write("where is xialv?")#不管光标位置,一定是追加写
#w+
f=open("test","w+",encoding="utf-8")
print(f.read())#什么都读不到,因为首先会覆盖,读的时候一定要记住光标的位置
f.write("where is xialv?")
f.seek(0)#将光标移到开始位置,参数是按字节,字节,字节,read的参数是字符
print(f.read())
print(f.tell())#tell是用来查看当前光标的位置,seek是用来调光标位置的,tell参数也是字节
#a+
f=open("test","a+",encoding="utf-8")
print(f.read())#读不到,他一开始光标就默认在最后
f.write("where is xialv?")#a+默认追加到最后

  7、seek的应用

  seek就是移动光标,如上边所给的例子,可以用于断点续传,但是只是知道

#w+和a+,需要通过seek读
12.08

  

  8、rb,wb,ab,针对二进制操作

f=open("test","rb")
print(f.read())#看见的都是bytes,字节数据
f=open("test","wb")
print(f.read())#看见的都是bytes,字节数据
f=open("test","ab")
print(f.read())#看见的都是bytes,字节数据

  9、with语句

  为了避免打开文件后忘记关闭,可以通过管理上下文,即:

1
2
with open(‘log‘,‘r‘) as f:
        pass

  如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

  在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

1
2
with open(‘log1‘) as obj1, open(‘log2‘) as obj2:
    pass

  10、文件修改的实质

  文件本身是无法修改的,所以我们要打开两个文件一个读(r文件),一个写(w文件),遍历原来的文件,如果不是我想处理的行就直接写入w文件,如果是拿出来对该行(字符串)进行修改,然后在改名字,把这个新的生成的文件当做修改的文件

对文件test进行修改,test内容如下:
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。

要求:在第四行后面加一个 岳飞

with open("test",endoding="utf-8")as f_read,ppen("test7",encoding="utf-8",mode="w")as f_write:
    count=0
    for line in f_read:
        if count==3:
            line="".join([line.strip(),"岳飞\n"])
        f_write.write(line)
        count+=1
import os
os.rename("test","test_bak")
os.rename("test7‘,"test")

  

文件操作