首页 > 代码库 > 文件操作

文件操作

参数

f = open("aa",mode="r",encoding="utf-8")    
#定义名 = open("文件名","模式",指定打开字符集方式)
  • f.name #查看db文件名
  • f.tell() 显示文件中,当前 光标位置
  • f.read() 读全部 (read是读字符 其他都是字节),f.read(5)读取5个字符
  • f.readline() 读一行 读取成列表形式
  • f.wirte() 写入
  • f.close() 关闭
  • f.seek(10) 移动10个字节 #f.seek(0,2)光标移动到最后操作 (对字节操作,utf-8中,汉字代表3个字节
  • f.encoding 查看字符编码
  • f.writable() 是否以写模式打开, #True为真 False为假
  • f.readable() 是否以读模式打开, #True为真 False为假
  • f.flush() 强制刷新到硬盘 #一般用于打印实时日志,基本不用,会导致硬盘速度变慢
 


文件读取模式  

f = open("aa",mode="r",encoding="utf-8")    
#定义名 = open("文件名","模式",指定打开字符集方式)
 
r  #读(指定文件名,需要手动创建文件) 

    先创建文件aa
    读取文件
    f = open("aa",mode="r",encoding="utf-8")    #默认是r 不加r也行
    f.read() #读取文件到内存
    print(f.readline(),end="")        #end="" 替换\n(可改),效果:结尾不会换行了, 注:print参数结尾默认是\n,
    print(f.writable())                 #是否以写模式打开, #True为真 False为假 print(f.readable())                 #是否以读模式打开, #True为真 False为假
    f.close() #结束
     
    #读取文件4个字符,\n也算字符
    with open("aa","r",encoding="utf-8")as f :print(f.read(4))

w    #写(没文件则创建,已有文件则清空并写入文件内容 )

    f = open("aa",mode="w",encoding="utf-8")
    #lyric是操作文件. mode="w" 写入模式 模式可替换. encoding="utf-8" 用utf-8格式打开lyric文件,
     
    f.write("wirte one work...\n") #\n 换行 write是写入参数
    f.write ("wirte seven eight nine ten\n")
    f.close() #结束
     
    -------------------------------------------------------------------
    rs = ["aa","bb","cc"]
    f = open("lyric","w") #打开lyric的写功能(lyric文件存在,则清空数据)
    for i in rs: #i是rs(内存中黑名单的元素)
    f.write(str(i)+"\n") #f.write 写入数据 str(i)+"\n" 写入i的每个值到lyric中,\n另起一行
    f.close() #文件结束

a  #追加(没文件则创建,已有文件则追加文件内容)

    f = open("a1a1",mode="a",encoding="utf-8")
    #aa是操作文件. mode="w" 写入模式 模式可替换. encoding="utf-8" 用utf-8格式打开lyric文件,
    f.write("wirte one work...\n") #\n 换行
    f.write ("wirte seven eight nine ten\n")
    f.close() #结束

#"+" 表示可以同时读写某个文件

r+  #先读,后追加 #可以指定长度修改

w+  #先清空+,后追加

a+  #先追加,后读取

 

#U表示 将\r    \n    \r\n自动转换成\n  (windows中换行是\r\n      linux中换行是\n 

rU  #r和U的组合

r+U #r+和U的组合

 

#b表示 处理二进制文件,对所有文件都能读取

rb 以2进制模式打开文件,不能声明encoding(不能指定字符类型,默认是二进制格式)

    #with...as... 优点:读取完文件自动关闭
    with open("aa","rb")as f :
    print(f.read().decode("utf-8"))    #decode 转成**模式显示



wb   以二进制写入文件,必须写入bytes格式

    f = open("111","wb")                   #111是文件
    f.write("guo 1 哈哈".encode("utf-8")) #写入时必须指定写入的编码类型
    print(f)
    f.close()

ab  以二进制追加文件,必须写入bytes格式

    f = open("111","ab")                        #111是文件
    f.write("guo 1 哈哈\n".encode("utf-8"))     #追加时必须指定写入的编码类型
    print(f)
    f.close()

 

rb+  #以二进制形式先读,后追加 #可以指定长度修改

wb+  #以二进制形式先清空+,后追加

ab+  #以二进制形式先追加,后读取

 

 

文件两种修改方式

    模式1

#读取文件修改后,保存到内存,再覆盖原文件 #弊端占内存,优点省硬盘空间 #文件lyric手动创建,写内容(文件包含aa) f = open("lyric",mode="r",encoding="utf-8") #定义变量f=打开lyric文件,模式:"读",encoding="utf-8"访问文件编码 data = http://www.mamicode.com/f.read() #定义变量data为读取文件内容 data = http://www.mamicode.com/data.replace("aa","bb") #replace文件替换, aa全部替换为bb f.close() #读模式结束 f=open("lyric",mode="w",encoding="utf-8") #定义变量f=打开lyric文件,模式:"写",encoding="utf-8"访问文件编码 f.write(data) #内存文件内容,写入到文件(原文件清空) f.close() #写模式结束 模式2
   #f文件每读一行并修改后,写入到f_new文件 #弊端占硬盘空间,优点省内存空间 import os #工具箱 f = open("lyric",mode="r",encoding="utf-8") #定义变量f=打开lyric文件,模式:"读",encoding="utf-8"访问文件编码 f_new= open("lyric_new",mode="w",encoding="utf-8") #定义变量f_new=打开lyric_new文件,模式:"写",encoding="utf-8"访问文件编码 for line in f: if "aa" in line: line = line.replace("aa","bb") #replace文件替换, aa全部替换为bb f_new.write(line) f.close() #读模式结束 f_new.close() #写模式结束 os.remove("lyric") #删除lyric文件 os.rename("lyric_new","lyric") #lyric_new改名为lyric

 

 
    #读取aa和bb文件操作

        读取aa和bb文件
        with open("aa","r",encoding="utf-8") as f_aa, open("bb") as f_bb:
        print(f_aa.read())
        print(f_bb.read())

    读取aa文件写入到bb

        with open("aa","r",encoding="utf-8") as f_aa, open("bb","w",encoding="utf-8") as f_bb:
        tow_f=f_aa.read()
        f_bb.write(tow_f)

    读取aa文件追加到bb

        with open("aa","r",encoding="utf-8") as f_aa, open("bb","a",encoding="utf-8") as f_bb:
        tow_f=f_aa.read()
        f_bb.write(tow_f)

 

 

2个文件转列表,转字典,转成列表中的N个字典

    #db文件格式
    #aa
    #bb
    #cc
    #读取db文件生成列表
    goods =[]
    for gn in open("goods","rt",encoding="utf-8"):
    goods.extend(gn.strip().split())
    price =[]
    for en in open("price","rt",encoding="utf-8"):
    price.extend(en.strip().split())
    print(price)
    #2个列表合并成字典
    shop=dict(zip(goods,price))
    print(shop)
    #字典转成列表的子集添加n个字典
    test = []
    for k, v in shop.items():
    test.append({"name": k, "m": v})
    print(test)

 

一个文件转成列表中的N个字典

    f2 = open(product, r, encoding=utf-8)
    product_data = f2.read()
    f2.close()
    v = product_data.split(\n)
    print(v)
    # 将列表转换成字典
    lin = []
    for i in v:
    v1 = i.split(:)
    print(v1)
    v1[1] = int(v1[1])
    dic = {v1[0]:v1[1]}
    lin.append(dic)
    print(lin)

 

 

光标问题

cuisor读取光标地址, read读取文件全部内容, seek 把光标移动到某个字节后面

    f.seek(10) 代表移动10个字节(utf-8中,汉字代表3个字节)

     
    创建文件lyric,填写内容如下

    123456testABCDE
    my name is guolm

     
    python执行命令:
        >>>f = open("lyric","r",encoding="utf-8") #encoding 指定读取文件类型的格式
        >>>print(cuisor:,f.tell())         #f.tell()显示当前文件内光标位置,
        cuisor: 0
        >>>print(f.read())               #读取f变量中全部内容, 如果是print(f.readline()) 读取一行内容
        123456testABCDE my name is guolm
        >>>print("--------------------------------------")
        >>>print(cuisor:,f.tell())         #f.tell()再次执行,28是当前光标所在字符位置
        cuisor: 33
        >>>print(f.read())               #上次执行read()读取全部,本次读取文件从最后执行,所有没内容
        >>>print("--------------------------------------")
        >>>f.seek(10)                  #f.seek(10) 代表移动10个字节后面, f.seek(0)移动到开头 (utf-8中,汉字代表3个字节)
        >>>print("cursor:",f.tell())          #因为上边操作,光标从10字节之后,执行命令
        cursor: 10
        >>>print(f.read(5))              #读取5字符 注:汉字代表一个字符,每行的结尾(\n)也代表一个字符
        ABCDE
        >>>f.close()                  #文件结束

 

文件操作