• python文件操作(2017-8-5)


    一、打开文件

    open(文件名,模式,编码)
    #默认模式为只读

    f = open("c:/asd.txt")
    date = f.read()
    f.close()
    print(date)

    打开文件时,需要指定文件路径和以何种方式打开文件,打开后,即可获取该文件
    句柄,如后通过此文件句柄对该文件操作。
    打开的模式有:
    r,只读文件,【默认】
    w,只写文件,【不可读,不存在创建;存在则清空内容】
    x,只写文件,【不可读,不存在创建,存在则报错】
    a,追加模式,【不可读,不存在创建,存在则只追加内容】

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

    r+,读写【可读,可写】
    w+,写读【可读,可写】
    x+,写读【可读,可写】
    a+,写读【可读,可写】

    "b"表示以字节的方式操作

    rb或r+b
    wb或w+b
    xb或w+b
    ab或a+b

    以b方式打开时,读取到的内容是字节类型,写入时也需提供字节类型

    只读情况下写入就报错
    基本打开方式
    #1、r,只读

    f = open("ha.log","r")
    f.write("sdf")#只读模式下写入就报错
    f.close()

    #2、w,只写模式

    f = open("asd","w")#清空原有文件内容
    f.write("asd")#重新写入
    f.close

    #3、x,只写模式

    f = open("asd""x")#不存在文件,就创建,存在文件就报错
    f.write("asd")
    f.close

    #4、a,追加模式

    f = open("asd","a")#不存在创建,存在追加
    f.write("asd")
    f.close


    字符串转字节(读)

    f = open("asd","r")#在这里打开时可以加encoding = "utf-8"
    date=f.read()
    f.close()
    b = bytes(date,encoding="utf-8")
    print(b)


    字节方式打开
    1、只读 rb

    f = open("asd","rb")#在这里打开时是以字节方式读,所以不需要加
    data = f.read() #encoding="utf-8"
    f.close()
    print(type(data))


    2、只写

    f = open("asd","wb")
    data = f.write(bytes("中国",encoding = "utf-8"))
    f.close()    #用二进制方式写入时,需要把字符串转换为二进制
    print(type(data))



    #普通打开
    #python内部将010101自动转换为字符串(因为在本质上在在硬盘里存的就
    是01010,所以在读取数据时也是0101,而普通打开时,会自动将字节转换为字符串
    默认使用utf-8编码
    而在转字符串是我们可以指定什么编码格式转成字符串)
    #010101======>python解释器(转换为字符串)=====>程序员看到


    #字节方式
    用字节方式打开时字节直接给到程序员,没有编译过程,所以不能添加encoding =""
    在你写入是,如果你写入的是字符串,你需要吧字符串转换为010101,不然会报错
    因为字节方式打开没有编译过程,存储时也不会自动编译成0101所以需要自己吧字符串转换为
    字节f.write(bytes("中国",encoding = "utf-8")),才能保存。
    #010101======>程序员看到
    文件里原来存储的是"中国"

    f = open("asd","rb")
    data = f.read()
    f.close()
    print(data)
    data1 = str(data,encoding = "utf-8")#如果是用python存储的就是utf-8,如果是自己在记事本写的可能需要用gbk

    二、操作文件

    写入时

    f = open("aaa","rb")
    str_a = "中国"
    bytes_a = bytes(str_a,encoding="utf-8")
    f.write(bytes_a)
    f.close()


    #r/w/x/a ==>输入输出都是字符串
    #rb/wb/xb/ab ==>输入输出都是字节
    用时一般不用带b的

    #r+先读再写 从开头开始写,里面有内容也是

    f = open("asda.log","r+")
    data = f.read()
    print(type(data),data)
    
    f.write("田本人")
    a=f.read()
    print(type(a),a)#在这里输出的是空的,在读写时有一个指针,你读一个,指针就向后移一个,追加一个字符
    #就再向后移一个,等你再次输出是,指针就指向空的地方,所以输出空的
    f.close()
    
    print(f.tell())#输出指针位置,字节,一个汉字三个字节
    print(f.read(3))#输出3个字符,指针也移动那个位置

    读的时候可以调整指针,写的时候直接写到最后,指针也yi'dao
    上面???????????????????????????????????????????有错??
    有一个例子

    f = open("asda.log","r+")
    data = f.read(3)
    print(type(data),data)
    print(f.tell())
    f.write("田本人")
    print(f.tell())
    a=f.read()
    print(type(a),a)
    print(f.tell())
    f.close()

    结果
    6
    36
    <class 'str'> 田本人田本人田本人田本人 #???
    36
    根据上面的那个例子,好像读取时的指针和写入时的指针好像不是同一个

    #w+ 先清空,在写过之后,就可以读了
    #先清空,之后写的就可以读了,写,指针指到最后

    f = open("ha.log""w+",encoding="utf-8")
    f.write("何莉莉")
    f.seek(0) #这个可以将指针移动到最开始(0),不移动,在输出是就的是空的
    data = f.read()
    f.close()
    print(data)

    #x+ 和w+雷同,附加一个功能,如果文件存在,就报错

    #a+ 打开文件的同时直接把指针指到最后
    #写时,追加,指针移到最后

    f = open("asda.log","a+",encoding="utf-8")
    print(f.tell())
    data = f.read()
    print(data)
    f.seek(0)
    data = f.read()
    print(data)
    f.close()


    #r+
    #从开始向后读
    #写,追加,指针调到最后

    #w+
    #先清空所有内容
    #从最开始向后读
    #写,追加,指针调到最后


    共有特性:seek调整位置,读取
    这些特性可以根据.seek() .tell() .read(3) .write() 进行实验调出
    #read()加参数就是读到那个位置,不加读取所有
    如果加一个b,就是读的字节

    三、文件关闭

    close()
    关闭文件

    fileno()
    文件描述符
    io操作,检测一个文本等记不清了

    fulsh() 
    刷新文件内部缓存区
    f1 = open("asda.log","r+",encoding="utf-8")
    f1.write("啊啊啊啊啊")
    #当文件还没有关闭时,这些东西就还没有存到硬盘里,只是在内存里
    就像你在记事本输入了一串字符但是没有保存一样,只是在内存里,flush()功能就是
    把写入的字符进行存储,就像记事本里的保存一样,把内存的内容刷新到硬盘里

    readable()
    是否可读

    readline()
    仅读取一行数据(自动把指针放在第一行末尾,再读时,就是从第二行开始)


    seekable()
    指针是否可操作

    truncate() 143 11.10
    依赖于指针,截断数据,仅保留指定长度的数据

    write()

    f = open()时直接把文件里的内容放到内存里防止问价太大把内存撑爆
    可以选择readline()一行一行的读,或者 for i in f: print(line)这样来一行一行的读

    with open(xxx,"") as f:
      f.read()

    等同于

    f = open(xxx,"")
    
    f.read()

    但是使用上面那个可以不用再写关闭文件的函数
    python自动帮你关闭

    py2.7之后 with ..as.. 同时打开两个文件

    with open("log1","r") as obj1,open("log2","w") as obj2:
      for line in obj1:
        obj2.write(line)

    #从log1文件里一行一行的读取log1文件的内容,然后再一行一行的写入log2中(读一行写一行)


    回顾总结
    1、lambda 可以接受两个参数
      func = lambda x,y:9+x
      参数: x,y
      参数体: 9+x==> return
      func: 函数名

      def func(x,y)
        return x+9


    单单一个函数名,不加括号,代之这个函数,加括号就是执行者个函数

        def f1()
            return "x"
        def f2(x)
            x()
            return "a"

    f2(f1)#这里的f1和x是一样的
    在f2(f1)中,如果在f2的函数体中执行了x()就相当与执行了f2函数,
    就相当于f2()
    函数可以当作参数传递

    def f3(arg):
      print(arg)

  • 相关阅读:
    [CF1355] Codeforces Round #643 (Div. 2)
    [ABC189] AtCoder Beginner Contest 189
    P3702 [SDOI2017]序列计数 (三模数NTT)
    P3321 [SDOI2015]序列统计 (NTT快速幂)
    洛谷P4157 [SCOI2006]整数划分
    洛谷P2553 [AHOI2001]多项式乘法
    洛谷P1919 (模板)A*B Problem升级版(FFT快速傅里叶)
    MySQL学习总结-详细版(包括下载安装)
    查看oracle数据库中表是否被锁
    SQL优化(面试题)
  • 原文地址:https://www.cnblogs.com/liudi2017/p/7667381.html
Copyright © 2020-2023  润新知