第九次课:Python文件操作

发布时间:2019-06-27 09:53:57编辑:auto阅读(1554)

      Python文件操作的方式有多种,这里学习两种,第一种是直接调用内置函数,无需引入模块;第二种就是引入os和shutil模块,这部分内容将在后续课程中介绍。下面就先开始学习第一种:

    1.读写操作

        open(file,op):打开指定文件file,若文件不存在则创建。其中file为文件名,file的路径默认为程序所在的位置,也可指定file的路径。

    参数op:

    (1)“r”或无:默认为“r”即简单打开文件。若省略参数op,文件不存在则会报错,写文件操作也会报错;

    (2)“w”:打开并可写文件。若文件已存在,则以前的内容将被清除;

    (3)“a”:向文件中追加文本。向已存在的文件中追加内容;

    (4)“b”:以二进制方式读取,提高安全性;

    (5)“r+”:以读写模式打开
    (6)“w+”:以读写模式打开 (参见 w )
    (7)“a+”:以读写模式打开 (参见 a )
    (8)“rb”:以二进制读模式打开
    (9)“wb”:以二进制写模式打开 (参见 w )
    (10)“ab”:以二进制追加模式打开 (参见 a )
    (11)“rb+”:以二进制读写模式打开 (参见 r+ )
    (12)“wb+”:以二进制读写模式打开 (参见 w+ )
    (13)“ab+”:以二进制读写模式打开 (参见 a+ )

    print '**********读操作**********'
    fone=open('1.txt')             #打开文件并将内容赋值给fone
    print(fone.read())               #读取文件,将文件内容全部输出
    # print(fone.readline())      #读取文件的第一行,可以指定范围
    # print(fone.readlines())    #把内容的每一行作为列表中的一部分,并返回列表
    print(fone.mode)               #获取当前open()模式
    fone.close()                         #关闭文件
    
    如果文件不存在将出现以下错误:
    IOError: [Errno 2] No such file or directory: '1.txt'
    正常运行结果:
    **********读操作**********
    This is first write example
    Two line
    Three line
    Four line
    r
    **********读操作**********
    This is first write example
    r
    **********读操作**********
    ['This is first write example\n', 'Two line\n', 'Three line\n', 'Four line\n']
    r

    如果在该模式下执行一个写操作,程序是报错的:

    fone.write('这是第一个写的操作')
    
    IOError: File not open for writing

    为了显示不出现乱码的情况,这里需要引入codecs模块
    import codecs
    print '**********写操作**********'
    print '**********覆盖写入**********'
    ftwo=codecs.open('1.txt','w')
    print '写入一条内容'
    ftwo.write('This is first write example\n')
    print '写入多条内容'
    ftwo.writelines(['Two line\n','Three line\n','Four line\n'])
    ftwo.close()
    print '**********追加写入**********'
    fthree=codecs.open('1.txt','a')
    print '写入一条内容'
    fthree.write('This is append content example')
    print '写入多条内容'
    fthree.writelines(['This','is','append','content','example'])
    fthree.close()

    注:使用open函数进行文件操作时,一定要记得使用close函数进行关闭;此外使用open函数打开并写文件时,就算文件存在,Python也会先删除原有文件然后创建新文件,也即文件的内容也随之删除!

    2.常用操作函数和属性

    (1)read([size]):size为读取的长度,以byte为单位;

    (2)readline([size]):读一行,如果定义了size,有可能返回的只是一行的一部分;

    (3)readlines([size]):把文件每一行作为一个list的一个成员,并返回这个list。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分;

    (4)write(str):把str写到文件中,write()并不会在str后加上一个换行符;

    (5)writelines(seq):把seq的内容全部写到文件中(多行一次性写入),不会在每行后面加上任何东西;

    (6)close():关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError异常;

    (7)flush():把缓冲区的内容写入硬盘;如打印一行文字print '文件的名称是:%s'%fopen.name,调用该方法将这行内容插入到文本中;

    (8)tell():返回文件操作标记的当前位置,以文件的开头为原点,常用来文件定位;

    (9)next():返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的;

    (10)seek(offset[,whence]):将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾;

    (11)encoding:指定文件的编码格式;

    (12)closed:查看当前文件的状态,关闭返回True,打开返回False;

    (13)name:返回文件的名称;

    (14)mode:返回文件当前的模式;

    import codecs
    f1=codecs.open('1.txt','ab+')
    print '文件名称是:%s'%f1.name
    f1.flush()
    f1.seek(40,1)
    #print f1.next()
    print f1.tell()
    print f1.closed
    print f1.mode
    f1.close()
    print f1.closed

    3.with语句

    在Python中有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。

    读取一个文件,如果不用with语句,代码如下:

    fopen=codecs.open('file.txt')
    fopen.read()
    fopen.close()

    代码的这类写法会有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。

    这时候with语句就显现出了它的优势了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:

    print '用with语句打开单个文件'
    with codecs.open('file.txt') as fopen:
    print(fopen.read())
    print '用with语句打开多个文件'
    with codecs.open('1.txt','r',encoding='gbk') as f1,codecs.open('2.txt','r') as f2:
    print f1.read()
    print f2.readline()

    如上可以看出,Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。

关键字