Python 文件操作

系统 1487 0

一、方法介绍

Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

注意: 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

            
              1
            
            
              #
            
            
               open函数的语法格式
            
            
              2
            
            
              3
            
             open(file, mode=
            
              '
            
            
              r
            
            
              '
            
            , buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=
            
              None)

            
            
              4
            
            
                  file: 必需,文件路径(相对或者绝对路径)。

            
            
              5
            
            
                  mode: 可选,文件打开模式

            
            
              6
            
            
                  buffering: 设置缓冲

            
            
              7
            
            
                  errors: 报错级别

            
            
              8
            
            
                  newline: 区分换行符

            
            
              9
            
                 closefd: 传入的file参数类型
          

mode的参数有:

模式
描述
r
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+
打开一个文件用于读写。文件指针将会放在文件的开头。先读后写才是安全的
rb+
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w+
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
wb+
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。


file中的常用方法:

方法
描述
file.close()
关闭文件。关闭后文件不能再进行读写操作。
file.flush()
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.next()
返回文件下一行
file.read([size])
从文件读取指定的字节数,如果未给定或为负则读取所有
file.readline([size])
读取整行,包括 "\n" 字符。
file.readlines([sizehint])
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint
字节的行, 实际读取值可能比sizhint较大, 因为需要填充缓冲区。
file.seek(offset[, whence])
设置文件当前位置
file.tell()
返回文件当前位置。
file.truncate([size])
截取文件,截取的字节通过size指定,默认为当前文件位置。
file.write(str)
将字符串写入文件,没有返回值
file.writelines(sequence)
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

二、文件的操作

2.1 读取文件

2.1.1 read

              
                 1
              
              
                #
              
              
                 路径有两种:
              
              
                 2
              
              
                #
              
              
                 1.相对路径,相对于当前程序所在的文件夹
              
              
                 3
              
              
                #
              
              
                    ../ 返回上一层目录
              
              
                 4
              
              
                #
              
              
                    相对的是当前程序所在的文件夹
              
              
                 5
              
              
                #
              
              
                 2.绝对路径
              
              
                 6
              
              
                #
              
              
                   * 从磁盘根目录寻找
              
              
                 7
              
              
                #
              
              
                   * 互联网上的绝对路径
              
              
                 8
              
              
                 9
              
               f = open(
              
                "
              
              
                a.txt
              
              
                "
              
              , mode=
              
                "
              
              
                r
              
              
                "
              
              , encoding=
              
                "
              
              
                utf-8
              
              
                "
              
              
                )

              
              
                10
              
              
                11
              
              
                #
              
              
                 read函数的参数是读取多少个字节,如果不加参数,默认是一次性读取文件的所有内容
              
              
                12
              
               data =
              
                 f.read()

              
              
                13
              
              
                #
              
              
                 打印读取的文件内容
              
              
                14
              
              
                print
              
              
                (data)

              
              
                15
              
              
                16
              
              
                #
              
              
                 关闭文件
              
              
                17
              
               f.close()
            

2.1.2 readlines

就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

              f = open(
              
                "
              
              
                a.txt
              
              
                "
              
              , mode=
              
                "
              
              
                r
              
              
                "
              
              , encoding=
              
                "
              
              
                utf-8
              
              
                "
              
              
                )

              
              
data =
              
                 f.readlines()

              
              
                #
              
              
                 打印读取的文件内容
              
              
                print
              
              (type(data))   
              
                #
              
              
                
              
              
                #
              
              
                 关闭文件
              
              
f.close()
            

2.1.3 readline 

读取一行数据

              f = open(
              
                "
              
              
                a.txt
              
              
                "
              
              , mode=
              
                "
              
              
                r
              
              
                "
              
              , encoding=
              
                "
              
              
                utf-8
              
              
                "
              
              
                )


              
              
                #
              
              
                 只读取一行数据
              
              
data =
              
                 f.readline()

              
              
                #
              
              
                 打印读取的文件内容
              
              
                print
              
              
                (data)


              
              
                #
              
              
                 关闭文件
              
              
f.close()
            

2.1.4 读取大文件

              f = open(
              
                "
              
              
                a.txt
              
              
                "
              
              , mode=
              
                "
              
              
                r
              
              
                "
              
              , encoding=
              
                "
              
              
                utf-8
              
              
                "
              
              
                )


              
              
                #
              
              
                 读取大文件的方法
              
              
                for
              
               line 
              
                in
              
              
                 f:
    
              
              
                print
              
              
                (line)

              
              
                #
              
              
                 关闭文件
              
              
f.close()
            

对可迭代对象 f,进行迭代遍历: for line in f ,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文件的问题。

 2.2 写文件

            
              1
            
            
              #
            
            
               w 模式写文件会将源文件覆盖
            
            
              2
            
             f = open(
            
              "
            
            
              a.txt
            
            
              "
            
            , mode=
            
              "
            
            
              w
            
            
              "
            
            , encoding=
            
              "
            
            
              utf-8
            
            
              "
            
            
              )

            
            
              3
            
            
              4
            
             f.write(
            
              "
            
            
              aaa
            
            
              "
            
            
              )

            
            
              5
            
            
              #
            
            
               关闭
            
            
              6
            
             f.close()
          
            
              1
            
            
              #
            
            
               追加
            
            
              2
            
             f = open(
            
              "
            
            
              a.txt
            
            
              "
            
            , mode=
            
              "
            
            
              a
            
            
              "
            
            , encoding=
            
              "
            
            
              utf-8
            
            
              "
            
            
              )

            
            
              3
            
             f.write(
            
              "
            
            
              ddd
            
            
              "
            
            
              )

            
            
              4
            
            
              f.flush()

            
            
              5
            
             f.close()
          
            
               1
            
            
              #
            
            
               r+ 默认模式指针在文件的开头
            
            
               2
            
            
              #
            
            
               f = open("老师点名", mode="r+", encoding="utf-8")
            
            
               3
            
            
              #
            
            
               s = f.read()
            
            
               4
            
            
              #
            
            
               print(s)
            
            
               5
            
            
              #
            
            
               f.write("周杰伦")
            
            
               6
            
            
              #
            
            
               f.close()
            
            
               7
            
            
              #
            
            
               神坑
            
            
               8
            
             f = open(
            
              "
            
            
              精品
            
            
              "
            
            , mode=
            
              "
            
            
              r+
            
            
              "
            
            , encoding=
            
              "
            
            
              utf-8
            
            
              "
            
            
              )

            
            
               9
            
             s = f.read(3)  
            
              #
            
            
               读3个字符
            
            
              10
            
            
              #
            
            
               不管你前面读了几个,后面去写都是在末尾
            
            
              11
            
             f.write(
            
              "
            
            
              aabbcc
            
            
              "
            
            )  
            
              #
            
            
               没有任何操作之前进行写,在开头写,如果读取了一些内容后再写,则是在最后
            
            
              12
            
            
              f.flush()

            
            
              13
            
             f.close()
          

文件内的光标移动

            
               1
            
             一: read(3
            
              ):

            
            
               2
            
               1
            
              . 文件打开方式为文本模式时,代表读取3个字符

            
            
               3
            
               2
            
              . 文件打开方式为b模式时,代表读取3个字节

            
            
               4
            
            
              二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

            
            
               5
            
            
                  seek(offset[, whence])

            
            
               6
            
                     offset --
            
               开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始

            
            
               7
            
                     whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2
            
               代表从文件末尾算起。

            
            
               8
            
            
               9
            
            
              10
            
            
              注意:

            
            
              11
            
               1. seek有三种移动方式0,1,2
            
              ,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

            
            
              12
            
               2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+
            
              等模式下测试效果 

            
            
              13
            
          

 

            
               1
            
            
              #
            
            
              !/usr/bin/python3
            
            
               2
            
            
               3
            
            
              #
            
            
               打开文件
            
            
               4
            
             fo = open(
            
              "
            
            
              runoob.txt
            
            
              "
            
            , 
            
              "
            
            
              r+
            
            
              "
            
            
              )

            
            
               5
            
            
              print
            
             (
            
              "
            
            
              文件名为: 
            
            
              "
            
            
              , fo.name)

            
            
               6
            
            
               7
            
             line =
            
               fo.readline()

            
            
               8
            
            
              print
            
             (
            
              "
            
            
              读取的数据为: %s
            
            
              "
            
             %
            
               (line))

            
            
               9
            
            
              10
            
            
              #
            
            
               重新设置文件读取指针到开头
            
            
              11
            
            
              fo.seek(0, 0)

            
            
              12
            
             line =
            
               fo.readline()

            
            
              13
            
            
              print
            
             (
            
              "
            
            
              读取的数据为: %s
            
            
              "
            
             %
            
               (line))

            
            
              14
            
            
              15
            
            
              16
            
            
              #
            
            
               关闭文件
            
            
              17
            
             fo.close()
          

2.3 with操作

              
                1
              
              
                 为了避免打开文件后忘记关闭,可以通过管理上下文,即:

              
              
                2
              
                 with open(
              
                '
              
              
                log
              
              
                '
              
              ,
              
                '
              
              
                r
              
              
                '
              
              
                ) as f:

              
              
                3
              
              
                如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

              
              
                4
              
              
                5
              
               在Python 2.7
              
                 后,with又支持同时对多个文件的上下文进行管理即:

              
              
                6
              
               with open(
              
                '
              
              
                log1
              
              
                '
              
              ) as obj1, open(
              
                '
              
              
                log2
              
              
                '
              
              ) as obj2:
            
              
                1
              
               with open(
              
                "
              
              
                a.txt
              
              
                "
              
              , mode=
              
                "
              
              
                r
              
              
                "
              
              , encoding=
              
                "
              
              
                utf-8
              
              
                "
              
              
                ) as f:

              
              
                2
              
                   data =
              
                 f.read()

              
              
                3
              
              
                print
              
              (data)
            
                
                  #
                
                
                   提示输入文件
                
                
oldFileName = input(
                
                  "
                
                
                  请输入要拷贝的文件名字:
                
                
                  "
                
                
                  )


                
                
                  #
                
                
                   以读的方式打开文件
                
                
oldFile = open(oldFileName,
                
                  '
                
                
                  rb
                
                
                  '
                
                
                  )


                
                
                  #
                
                
                   提取文件的后缀
                
                
fileFlagNum = oldFileName.rfind(
                
                  '
                
                
                  .
                
                
                  '
                
                
                  )

                
                
                  if
                
                 fileFlagNum >
                
                   0:
    fileFlag 
                
                =
                
                   oldFileName[fileFlagNum:]


                
                
                  #
                
                
                   组织新的文件名字
                
                
newFileName = oldFileName[:fileFlagNum] + 
                
                  '
                
                
                  [复件]
                
                
                  '
                
                 +
                
                   fileFlag


                
                
                  #
                
                
                   创建新文件
                
                
newFile = open(newFileName, 
                
                  '
                
                
                  wb
                
                
                  '
                
                
                  )


                
                
                  #
                
                
                   把旧文件中的数据,一行一行的进行复制到新文件中
                
                
                  for
                
                 lineContent 
                
                  in
                
                
                   oldFile.readlines():
    newFile.write(lineContent)


                
                
                  #
                
                
                   关闭文件
                
                
                  oldFile.close()
newFile.close()
                
              
文件备份

2.4 文件的相关操作

              
                 1
              
              
                import
              
              
                 os

              
              
                 2
              
              
                 3
              
              
                #
              
              
                 文件重命名
              
              
                 4
              
               os.rename(
              
                "
              
              
                毕业论文.txt
              
              
                "
              
              , 
              
                "
              
              
                毕业论文-最终版.txt
              
              
                "
              
              
                )

              
              
                 5
              
              
                 6
              
              
                #
              
              
                 删除文件
              
              
                 7
              
               os.remove(
              
                "
              
              
                毕业论文.txt
              
              
                "
              
              
                )

              
              
                 8
              
              
                 9
              
              
                #
              
              
                 创建文件夹
              
              
                10
              
               os.mkdir(
              
                "
              
              
                abc
              
              
                "
              
              
                )

              
              
                11
              
              
                12
              
              
                #
              
              
                 获取当前目录
              
              
                13
              
              
                os.getcwd()

              
              
                14
              
              
                15
              
              
                #
              
              
                 改变默认目录
              
              
                16
              
               os.chdir(
              
                "
              
              
                ../
              
              
                "
              
              
                )

              
              
                17
              
              
                18
              
              
                #
              
              
                 获取目录列表
              
              
                19
              
               os.listdir(
              
                "
              
              
                ./
              
              
                "
              
              
                )

              
              
                20
              
              
                21
              
              
                #
              
              
                 删除文件夹
              
              
                22
              
               os.rmdir(
              
                "
              
              
                abc
              
              
                "
              
              )
            
                
                  #
                
                
                   创建新文件,把修改后的文件写入新文件,删除老文件,再重命名新文件
                
                
                  import
                
                
                   os

with open(
                
                
                  "
                
                
                  吃的
                
                
                  "
                
                , mode=
                
                  "
                
                
                  r
                
                
                  "
                
                , encoding=
                
                  "
                
                
                  utf-8
                
                
                  "
                
                
                  ) as f1, \
        open(
                
                
                  "
                
                
                  吃的_副本
                
                
                  "
                
                , mode=
                
                  "
                
                
                  w
                
                
                  "
                
                , encoding=
                
                  "
                
                
                  utf-8
                
                
                  "
                
                
                  ) as f2:
    
                
                
                  for
                
                 line 
                
                  in
                
                
                   f1:
        new_line 
                
                = line.replace(
                
                  "
                
                
                
                  "
                
                , 
                
                  "
                
                
                
                  "
                
                
                  )
        f2.write(new_line)


os.remove(
                
                
                  "
                
                
                  吃的
                
                
                  "
                
                )     
                
                  #
                
                
                   删除文件
                
                
os.rename(
                
                  "
                
                
                  吃的_副本
                
                
                  "
                
                , 
                
                  "
                
                
                  吃的
                
                
                  "
                
                )    
                
                  #
                
                
                   重命名文件
                
              
修改文件内容
                
                  #
                
                
                  coding=utf-8
                
                
                  
#
                
                
                   批量在文件名前加前缀
                
                
                  import
                
                
                   os

funFlag 
                
                = 1 
                
                  #
                
                
                   1表示添加标志  2表示删除标志
                
                
folderName = 
                
                  '
                
                
                  ./renameDir/
                
                
                  '
                
                
                  #
                
                
                   获取指定路径的所有文件名字
                
                
dirList =
                
                   os.listdir(folderName)


                
                
                  #
                
                
                   遍历输出所有文件名字
                
                
                  for
                
                 name 
                
                  in
                
                
                   dirList:
    
                
                
                  print
                
                
                   name

    
                
                
                  if
                
                 funFlag == 1
                
                  :
        newName 
                
                = 
                
                  '
                
                
                  [东哥出品]-
                
                
                  '
                
                 +
                
                   name
    
                
                
                  elif
                
                 funFlag == 2
                
                  :
        num 
                
                = len(
                
                  '
                
                
                  [东哥出品]-
                
                
                  '
                
                
                  )
        newName 
                
                =
                
                   name[num:]
    
                
                
                  print
                
                
                   newName

    os.rename(folderName
                
                +name, folderName+newName)
              
批量修改文件名
 

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论