python之-----文件操作

   一.初识文件操作

使用python来读写文件时非常简单的操作,我们会使用open()函数来打开一个文件,来获取文件的句柄,然后通过文件句柄来进行各种各样的操作,根据打开方式的不同能执行的操作也会有不同,

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

#1.打开文件,得到文件句柄赋值给一个变量.
f = open("a.txt","r",encoding="utf-8")  #默认打开方式为r(读文件)
  
#2.通过句柄对文件进行操作.
s = f.read()         #读文件,

#3.读取文件
print(s)


#4.关闭文件
f.close()

         文件操作函数:  f = open(文件名(路径),mode="?",encoding="字符集")

   模式:(mode)::r, w, a ,r+, a+, w+, rb, wb, ab, r+b, w+b, a+b

   字符集:utf-8,bgk,.........

   注意:文件以什么方式存的,就要以什么方式打开.

   二.文件的打开模式  

#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.写读 [可写,可读]

   ***1.只读操作(r)

       文件路径

    ㈠绝对路径:从磁盘的根目录寻找, 或者 从互联网寻找一个路径(网址)

扫描二维码关注公众号,回复: 2585889 查看本文章

   ㈡相对路径(用的多):相对于当前程序所在的文件夹        ../ 上层文件夹

   

     相对路径:
f = open("急急急.txt",mode="r",encoding="utf-8") s = f.read() print(s) f.close() #如果没有没有这个,你在下面的程序中如果删除这个文件,会报错. 结果: 我是真好看!!!! 急急急.txt的文件夹例的内容为:我是真好看!!!!

   比如在e盘里创建一个叫abc的文件夹里有个叫我很好看的txt文件.

      绝对路径:
f = open("e:/abc/我很好看.txt",mode="r",encoding="gbk") s = f.read() print(s) f.close() 结果: 对,我是真的好看!
f = open("急急急.txt",mode="r",encoding="utf-8")
for line in f:                #文件是一个可迭代对象
    print(line.strip)       #一行一行的处理数据,加strip()可以讲行与行之
                                         间的空格去掉
 
结果:
床前明月光
疑是地上霜
举头望明月                        #循环语句,将大文件全部读取,这种方式是最好的,每次读取一行内容,不会
低头思故乡                                产生内存溢出来的问题.


急急急文件夹里的内容:
床前明月光
疑是地上霜
举头望明月
低头思故乡

   ***2.写模式(w)

f = open("哈哈哈",mode="w",encoding="utf-8")
f.write("澳门赌场上线了!")
f.flush()
f.close()


#如果没有建立文件夹,会自动添加文件夹
  如果已经有文件夹了,会将文件夹的内容删除在添加新内容.

   ***3.追加模式(a):

   在追加模式中,我们写入的东西会追加在文件的结尾.

   写的时候,如果换行需要手动   \n     ,不换行就会在后面一行

    注意:在a,w,r中,只有追加a,光标才在最后面

f = open("哈哈哈",mode="a",encoding="utf-8")
f.write("最近上线了!")
f.write("xx荷官在线发牌!\n")
f.write("客官快来呀!")
f.flush()
f.close()


结果:
澳门赌场!z最近上线了!xx荷官在线发牌!客官快来呀!最近上线了!xx荷官在线发牌!
客官快来呀

   4.读写(r+),写读(w+),追加读(a+)

     *** r+:对于写读模式,必须是先读的,因为默认光标是在开头的,读完之后再进行写入.

     w+:先将所有的内容清空,然后写入,最后读取.但是读取的内容是空的.

     a+:在a+模式下,不论先读还是后读,都是读不到数据的.

    注意:不论读取多少内容,光标在哪里,写入的时候都是在结尾写入,光标在结尾,后面没有东西,所以读取内容为空.

f = open("哈哈哈",mode="r+",encoding="utf-8")
s = f.read(3)          #读取3个字符
print(s)
f.write("有惊喜1")      #在末尾写

结果:
澳门赌


哈哈哈  文件夹内容:
 澳门赌场!z最近上线了!xx荷官在线发牌!客官快来呀!最近上线了!xx荷官在线发牌!
客官快来呀!有惊喜1
   很少用,因为会清空文件夹的内容
f = open("哈哈哈",mode="w+",encoding="utf-8")
s = f.write("哇哦,好厉害!")     #写完之后光标在最后,读取时没有内容的
f.seek(0)                        #移动光标,移动到开头.
s = f.read()
print(s)
f.flush()
f.close()

结果:
哇哦,好厉害!


哈哈哈  文件夹内容:
哇哦,好厉害!
f = open("哈哈哈",mode="a+",encoding="utf-8")
f.write("无益哇咔咔")
f.seek(0)
s = f.read()
print(s)
f.flush()
f.close()


结果:
哇哦,好厉害!无益哇咔咔


哈哈哈  文件夹内容:
哇哦,好厉害!无益哇咔咔

   ***5.rb ,ab ,wb模式: 

     rb,wb,ab,b(bytes字节)如果处理的是非文本文件,mode里如果有b,encoding就不能给了.

f = open("c:/pdd.jpg",mode="rb")      #不能写encoding
e = open("e:/pdd.jpg",mode="wb")
for line in f:              #从C盘读取,line你是不知道读取了多少数据的,所以一
    e.write(line)             行一行的读取.写入到e盘
f.close()
e.flush()
e.close()



结果;
将c盘里的pdd的图片写入到e盘里面.

  三.常用操作:

1.seek(n)光标移动到n位置,注意,移动的单位是byes.

   通常我们使用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)

f.seek(0)                    #移动到开头
f.write("哇哈哈")          #写入信息,此时光标在9  中文3*3个=9
                                                                   一个中文=3个字节
f.flush()
f.close()

  2.tell()

     使用tell()可以帮助我们获取当前光标在什么位置.

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
                                                                      一个中文=3个字节
print(f.tell())           #光标位置9                                                          
f.flush()
f.close()

  3.truncate()   截断文件

f = open("哈哈哈",mode="w",encoding="utf-8")
f.write('呵呵')           #写入2个字节
f.seek(3)                 #光标移动到3,也就是两个字中间
f.truncate()              #删除光标后面的所有内容
f.close()  
  
  
f = open("哈哈哈",mode="r+",encoding="utf-8")
content = f.read(3)      #读取12个字符
f.seek()
print(f.tell())
f.truncate()                #后面的所有内容全部都删除
f.flush()
f.close()

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

  想要进行截断操作,要先挪动光标,挪到你想截断的位置,在进行截断.

  四.修改文件

      修改文件

                 ①.引入os模块      import os

                ②.打开目标文件  r

               ③.打开文件的副本    w

              ④.从r中读取内容进行修改,写入到副本中.

             ⑤.删除源文件

            ⑥.重命名副本,将新文件的名字改成老文件的名字.

# f1 = open("Tom昨天干嘛去了", mode="r", encoding="utf-8")
with open("Tom昨天又干嘛去了", mode="r", encoding="utf-8") as f1, \
    open("Tom昨天又干嘛去了_副本", mode="w", encoding="utf-8") as f2:

    for line in f1:
        line = line.replace("Tom", "jk")
        f2.write(line)


os.remove("Tom昨天又干嘛去了")   # 删除文件
time.sleep(3)      #将时间定为3秒,可以让人看到,要不然太快了
os.rename("Tom昨天又干嘛去了_副本","Tom昨天又干嘛去了")
    # 重命名新文件

    注意:这是循环,如果一次将内容进行读取,会出现内存溢出,所以一行一行的读取和操作.

猜你喜欢

转载自www.cnblogs.com/zmc940317/p/9432059.html