zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    Oracle常用命令大全(很有用,做笔记)
    表格驱动编程在代码中的应用
    mac 利用svn下载远程代码出现Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
    FAILURE: Build failed with an exception.
    There is an internal error in the React performance measurement code.Did not expect componentDidMount timer to start while render timer is still in progress for another instance
    react native TypeError network request failed
    Android向系统相册中插入图片,相册中会出现两张 一样的图片(只是图片大小不一致)
    react-native Unrecognized font family ‘Lonicons’;
    react-native SyntaxError xxxxx/xx.js:Unexpected token (23:24)
    Application MyTest has not been registered. This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent.
  • 原文地址:https://www.cnblogs.com/liudi2017/p/7667381.html
Copyright © 2011-2022 走看看