zoukankan      html  css  js  c++  java
  • python学习-day18、文件处理、

    4、文件操作

    武sir:http://www.cnblogs.com/wupeiqi/articles/4943406.html

    林海峰:http://www.cnblogs.com/linhaifeng/articles/5984922.html

    4.1、文件处理流程

    1. 打开文件,得到文件句柄并赋值给一个变量
    2. 通过句柄对文件进行操作
    3. 关闭文件、把渔网回收--占用操作系统的资源
    f = open('chenli.txt') #打开文件  python会默认按照系统编码打开文件:win:GBK,macos:UTF-8.
    first_line = f.readline()
    print('first line:',first_line) #读一行
    print('我是分隔线'.center(50,'-'))
    data = f.read()# 读取剩下的所有内容,文件大时不要用
    print(data) #打印读取内容
     
    f.close() #关闭文件

      4.2、打开文件例子

    f=open('ha.log','r ')
    #f.read()        #把文件读出来
    data=f.read()   #接收文件内容
    f.close()
    print(data)
    
    >>>
    hellodd
    dsdsdasdsdsad

    打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

      4.3文件打开模式

    文件句柄 = open('文件路径', '模式')
    打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

    模式大全:

    • r,只读模式【默认模式,文件必须存在,不存在则抛出异常】
    • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
    • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

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

    • r+,可读写文件。【可读;可写;可追加】
    • w+,写读
    • a+,同a

    "U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)

    • rU
    • r+U

    "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

    • rb
    • wb
    • ab

    4.4、代码例子-

    一、基本打开操作

    ①、只读模式

    #只读模式:r  也是默认模式
    
    f=open('ha.log','r')
    data=f.read()
    print(data)
    
    >>>
    dsdsdssdsdadalaixiaoyun

    ②'w'只写模式

    #、只写模式'w'  如果文件不存在,就创建一个新文件.存在则清空内容。不可读!
    
    f=open('ha.log','w')
    f.write('dsdsdssdsdadalaixiaoyun')
    
    # data=f.read()   #不可读
    # print(data)
    # f.close()
    
    f=open('laixioa.log','w')
    f.write('sdsds')
    f.close()

    ③'x模式' 只写模式,不存在的话自动创建。对于已经创建的文件,则会报错

    # 'x'模式python3x新加的内容。只写模式,存在则报错,不存在则创建。
    
    f=open('laixiaoyun.log','x')
    f.write('sdsdsdsd')
    Traceback (most recent call last):
      File "/Users/laixiaoyun/PycharmProjects/untitled1/day17/文件操作-武sir.py", line 41, in <module>
        f=open('laixiaoyun.log','x')
    FileExistsError: [Errno 17] File exists: 'laixiaoyun.log'
    
    Process finished with exit code 1
    View Code

    ④、‘a’追加模式,可读;   不存在则创建;存在则只追加内容;

    # 'x'模式python3x新加的内容。只写模式,存在则报错,不存在则创建。
    
    f=open('laixiaoyun.log','a')
    f.write('sdsdsdsd222')

     二、字节模式打开文件

    "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)。计算机本质上是以二进制形式打开,然后转化为字符串的形式。如果把模式后面加上‘b’。计算机读出来都就会以,字节形式打开。

    • rb  
    • wb
    • ab
    #如果要以直接模式打开,需要自己进行转化
    f=open('laixiaoyun.log','r')
    data=f.read()
    b=bytes(data,encoding='utf-8')
    print(data)
    print(type(data))
    print(b)
    print(type(b))

    一、只读模式:rb

    #python2.*  字节读取的时候先获得二进制数据,然后按照指定的编码转化为字符串 python3,可以指定"b"模式字节用二进制打开
    f=open('laixiaoyun.log','r')
    data=f.read()
    # b=bytes(data,encoding='utf-8')
    print(data)
    print(type(data))
    #print(b)
    #print(type(b))
    
    #python3  字节提供用二进制模式打开的操作.遇到"b"模式的时候,就不需要进行转化。
    
    f=open('ha.log','rb',)
    data=f.read()
    print(data)
    f.close()
    print(type(data))
    
    >>>
    1laixiao22211111111
    <class 'str'>
    b'dsdsdssdsdadalaixiaoyun'
    <class 'bytes'>

    二、只写模式:wb

    #2、只写
    
    f=open('ha,log','ab')
    f.write(bytes('有一个人的名字叫做赖晓云',encoding='utf-8') ) #不走系统转化路径,在写入之前需要自己转化为字节。
    f.close()

    总结:

    一、文件打开方式

    普通方式:

    python内部将二进制(0101010001011111),转化为字符串(默认utf-8)

    二进制方式:b模式.不经过python解释器,直接转化为二进制,写入!

    读:

    f=open('ha,log','rb')
    #f.write(bytes('有一个人的名字叫做赖晓云',encoding='utf-8') ) #不走系统转化路径,在写入之前需要自己转化为字节。
    print(f.read())
    f.close()
    
    >>>>
    b'xe6x9cx89xe4xb8x80xe4xb8xaaxe4xbaxbaxe7x9ax84xe5x90x8dxe5xadx97xe5x8fxabxe5x81x9axe8xb5x96
    xe6x99x93xe4xbax91xe6x9cx89xe
    str_data=str(data,encoding='utf-8') #通过字符串转化,把字节转化为字符串
    print(type(str_data))

    写:

    f=open('ha,log','ab')  #追加模式,每一次运行就添加
    f.write(bytes('有一个人的名字叫hhhjh做赖晓云',encoding='utf-8') ) #不走系统转化路径,在写入前,需要自己转化为字节。
    # data=f.read()
    # print(data)
    f.close()
    
    >>>
    有一个人的名字叫做赖晓云有一个人的名字叫hhhjh做赖晓云有一个人的名字叫hhhjh做赖晓云

    模式转换

    f=open('haa,log','rb',)
    data=f.read()
    print(data)
    f.close()
    print(type(data))
    
    
    str_data=str(data,encoding='utf-8')
    print(str_data)
    print(type(str_data))
    
    >>>>
    b'xe6x9cx89xe4xb8x80xe4xb8xaaxe4xbaxbaxe7x9ax84xe5x90x8dxe5xadx97xe5x8fxabhhhjhxe5x81x9axe8xb5x96xe6x99x93xe4xbax91xe6x9cx89xe4xb8x80xe4xb8xaaxe4xbaxbaxe7x9ax84xe5x90x8dxe5xadx97xe5x8fxabhhhjhxe5x81x9axe8xb5x96xe6x99x93xe4xbax91'
    <class 'bytes'>
    有一个人的名字叫hhhjh做赖*云有一个人的名字叫hhhjh做赖*云
    <class 'str'>

    二、模式大全

    正常模式:r/w/x/a  只模式  →写入都是字符串类型

    r模式:rb/wb/xb/ab  →字节类型  未来学到:socket的时候,还会再次接触

    “+”号:可读、可写。

    #r+,可读写文件。【可读;可写;可追加】先进行写的时候:末尾追加。一打开光标在第一位 从头开始追加,光标停留在追加结束位置。

    #w+,先清空。再写。并且指针在最后。从开始往后读!
    #x+  和w+一样。只不过文件存在就会报错。
    #a+  默认是追加模式。一打开,指针就调到最后。写的时候,默认指针也是在最后。

    三、指针 

    f=open('laixiayun2.log','r+',encoding='utf-8')
    print(f.tell())  #指针为0  起始位置
    print(f.read(1))
    print(f.tell())
    f.write('赖晓云')
    print(f.tell())
    print(f.read())
    
    f=open('laixiayun3.log','w+',encoding='utf-8')
    print(f.tell())  #指针为0  起始位置
    print(f.read(1))
    print(f.tell())
    f.write('赖晓云')
    print(f.tell())
    print(f.read())
    
    
    #f.tell() 获取指针的位置。
    #f.seek(num)  调整指针的位置。

     四、file方法:

    一、class file(object):

    • def close(self):关闭文件
    • def fileno(self):文件描述
    • def flush(self):刷新文件内部缓冲区
    f=open('laixiayun2.log','r+',encoding='utf-8')
    print(f.tell())  #指针为0  起始位置
    print(f.read(1))
    print(f.tell())
    f.write('赖晓云')
    f.flush()      #主动把写的内容刷入硬盘。时时保存数据
    a=input(">>>") #由于一直等待输入,进程为结束,所以写只在内存,没有存入硬盘。需要使用
    print(f.tell())
    print(f.read())
    • def isatty(self):判断文件是否是同意tty设备
    • def next(self):获取下一行数据,不存在,则报错
    • def read(self, size=None):读取指定字节数据

        默认方式打开:读取一个字符

        字节方式打开:读取一个字节

    • def readline(self, size=None):仅读取一行数据。每次指针放在末尾。下一次重新读取一行。
    f=open('laixiaoyun23.log','r+')
    print(f.tell())
    data_line=f.readline()
    print(data_line)
    
    >>>
    0
    我是22多22

    f=open('chenli.txt','r')  
    print(f.readline()) #记录上一次读取的位置,.一共会读到两个‘
    ’符号,:文件中自带换行、print自带的换行符号  所以:print(‘飒飒’,end='')去除了end的换行符号
    print(f.readline()) 
    print(f.readline())
    
    >>>
    
    正趣果上果
    
    Interesting fruit fruit
    
    词:郭婞
    
    
    • defreadlines(self, size=None):读取所有数据,并根据换行保存到一个列表中,一行为一个元素
    f=open('chenli.txt','r')
    print(f.readlines(),end='')
    
    ['正趣果上果
    ', 'Interesting fruit fruit
    ', '词:郭婞
    ', '曲:陈粒
    ', '编曲/混音/和声:燕池
    ', '萧:吗子
    ', 'Words: Guo 婞
    ', 'Song: Chen tablets
    ', 'Arrange / Mix /
    • def seek(self, offset, whence=None):指定文件中指针位置
    f.seek(num)
    • def  tell(self):获取当前指针位置
    • deftruncate(self, size=None):截断数据,仅保留指定之前数据。会依赖于指针!
    f=open('laixiaoyun23.log','r+')
    print(f.tell())
    print(f.seek(6))
    f.truncate()
    f.close()
    >>
    #文件内容剩余:我是
    截取指针之前的内容
    • def write(self, p_str):写内容;如果文件存在,则会清空文件。文件不存在,则会新建

    写的过程中,需要自己加上换行符

      !f.write(3)会出现报错。因为文件内部全部都是字符串。

    f=open('chenli.txt','r')
    f.write('2222
    ')
    f.write('dsadsadsd
    ')
    • defwritelines(self, sequence_of_strings):将一个字符串列表写入文件

        可以用于文件的修改!!

    • defxreadlines(self):可用于逐行读取文件,非全部

     必须记住:

    文件操作基本的功能:

    close、flush、read()、readline、seek、tell、truncate、write、

    循环文件:

    f=open('laixiaoyun23.log','r',encoding='utf-8')
    
    for line in f:
        print(line)   #一行一行的读取:可以读出所有行
    
    f.readline()      #一行一行往下读取。不知道尽头!!

    五、关闭:with关键字,

    with open as :

      代码块

    #好处,复制一个10G大小的文件。最笨的方法直接赋值。导致内存被撑爆!可以同时两个文件
    #在打开新文件的同时,创建新文件。(打开不占用内存,读的过程才会占用内存)
    #一行一行的读取,然后一行一行的存。可以解决问题。
    #with结束后,同时关闭两个文件。等价于:obj1=open('源文件',),obj2=open(‘新文件’,‘w’)
    
    with open('原文件','r') as obj1,open('新文件','w') as obj2: for line in obj1: print(line) obj2.write(line)

    六、文本处理

    f.read()    一次性读取文件的所有内容

    f.readline()  一次读取文件一行

    f.readlines()  一次性读取文件所有内容,并且按照一行一个元素,形成一个大字典。把保存给变脸,可以实现迭代操作

    我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。

    文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。

    每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。

    .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。

    .readline() 和 .readlines() 非常相似。它们都在类似于以下的结构中使用:

    src_f=open('chenli.txt')
    data=src_f.readlines()  #读成为一个列表
    for i   in data:
        print(i,end='')
    
    >>>
    正趣果上果
    Interesting fruit fruit
    词:郭婞
    曲:陈粒
    编曲/混音/和声:燕池
    萧:吗子
    Words: Guo 婞
    Song: Chen tablets
    Arrange / Mix / Harmony: Yan Chi
    Xiao: Well
    你佩桃木降妖剑
    他会一招不要脸

    七、文件修改

      文件本质上不能修改,只能通过新文件覆盖原文件,实现修改。

    文件打开都是通过软件打开,从硬盘加载到内存中,在内存是可以对文件进行修改的。修改的时会把内容加载到一个新文件中。保存的时候,就会覆盖源文件,从而实现修改操作!

    readlines和writelines  都城为一个列表,写的时候按照列表的数据类型来写,通过列表的索引和切片进而可以实现修改操作。

    src_f=open('chenli.txt')
    data=src_f.readlines()  #读成为一个列表
    print(data)
    src_f.close()
    
    after_f=open('chenli_1','w')
    after_f.writelines(data)
    print(data[10])
    
    >>>
    ['正趣果上果
    ', 'Interesting fruit fruit
    ', '词:郭婞
    ', '曲:陈粒
    ', '编曲/混音/和声:燕池
    ', '萧:吗子
    ', 'Words: Guo 婞
    ']
    
    你佩桃木降妖剑

     八、指针归零

      对于打开的文件,只要不关闭,指针就不会归零。

    比如f.read(8)之后,在没有close之前。以后在:for循环,readline都会从上一次开始往下读。

    对于处理文件增量,需要记录上一个位置的过程中。可以在关闭结束前,tell下光标的位置。下次打开后seek上一次光标的位置!

     

    九、bytes-字节模式,以字节的方式来写文件。二进制。打开时不需要指定特定的编码。

    f=open('chenli_1','rb')
    print(f.readline())
    
    >>>
    b'xe6xadxa3xe8xb6xa3xe6x9ex9cxe4xb8x8axe6x9ex9c
    '

    字符串转化为字节模式:

    a='演讲'.encode('utf-8') 直接用字符串方法转化也是可以的!
    a=bytes('赖晓云',encoding='UTF-8')
    
    #字符串------编码:encode----字节
    #字节--------解码:decode----字符串
    print(a)
    print(a.decode('utf-8'))
    
    >>>
    b'xe8xb5x96xe6x99x93xe4xbax91'
    赖晓云

  • 相关阅读:
    腾讯TDW:大型Hadoop集群应用[转载]
    [转]常见分布式系统数据分布解析
    一种基于Storm的可扩展即时数据处理架构思考
    storm
    storm
    精华文章
    Dubbo使用解析及远程服务框架
    职责链实现的apache.chain使用
    设计模式之享元模式
    SVN安装与eclipseSVN插件基本使用
  • 原文地址:https://www.cnblogs.com/laixiaoyun/p/6142532.html
Copyright © 2011-2022 走看看