Python内置了一个open()方法,用于对本地文件进行读写操作。这个功能简单、实用,属于必须掌握的基础知识。

  使用open方法操作文件可以分三步走,一是打开文件,二是操作文件,三是关闭文件。下面分别介绍:  

一、打开文件

  其基本语法:f = open('文件名','打开模式')

  打开模式:

    r   只读    默认模式,如果文件不存在就报错,存在就正常读取。

    w  只写    如果文件不存在,新建文件,然后写入;如果存在,先清空文件内容,再写入。

    a  追加    如果文件不存在,新建文件,然后写入;如果存在,在文件的最后追加写入。

    x  只写    如果文件存在则报错,如果不存在就新建文件,然后写入内容,比w模式更安全。python3以上新增。

    +  读写模式  比如r+     w+     a+      (下文详细说明)

    b  二进制模式 比如rb   wb  ab     这个和bytes类型、字符串类型有关系(下文详细说明)

    还有r+b  w+b  a+b的组合模式,不在一一列举

  特别强调:

   1. b模式:二进制模式,也就是01010101之类的比特流。需要特别注意,它在读写的时候是以字节类型(bytes)读写的,因此获得的是一个字节对象而不是字符串。在这个读写过程中,需要自己指定字节类型的编码格式。以write()方法为例进行说明,read()方法也是同样的。

s = 'this is a test'
b = bytes(s,encoding='utf-8')

f = open('test.txt','w')
f.write(s)

##这样没问题,正常写入了文件。

##-------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')

f = open('test.txt','wb')    ##注意多了个b
f.write(s)

##报错
TypeError: a bytes-like object is required, not 'str'
##意思是它需要一个bytes类型数据,你却给了个字符串

##---------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')

f = open('test.txt','wb')    ##注意多了个b
f.write(b)                        ##将变量b传给它,b是个bytes类型

##成功执行!

  因此,在使用带b的模式时一定要注意传入的数据类型。没有b以字符为单位进行读写,有b则以字节为单位读写。

  2. +模式:   对于w+,事实上这种模式,在读写之前都会清空你文件内容,请不要使用!

        对于a+模式,事实上这种模式,你永远只能在文件的末尾写入,有局限性,请不要使用!

        对于r+模式,相对来说最好的读写模式,配合seek()和tell()方法,可以实现大部分操作。

二、文件操作方法

  在Python3中,基本的文件操作方法有:

class TextIOWrapper(_TextIOBase):

    def close(self, *args, **kwargs):
        关闭文件
        pass

    def fileno(self, *args, **kwargs):
        文件描述符
        pass

    def flush(self, *args, **kwargs):
        刷新文件内部缓冲区
        pass

    def isatty(self, *args, **kwargs):
        判断文件是否是同意tty设备
        pass

    def read(self, *args, **kwargs):
        读取指定字节数据
        pass
  
    def readable(self, *args, **kwargs):
        是否可读
        pass

    def readline(self, *args, **kwargs):
        仅读取一行数据
        pass

    def seek(self, *args, **kwargs): #
        指定文件中指针位置
        pass

    def seekable(self, *args, **kwargs):
        指针是否可操作
        pass

    def tell(self, *args, **kwargs):
        获取指针位置
        pass

    def truncate(self, *args, **kwargs):
        截断数据,仅保留指定之前数据
        pass

    def writable(self, *args, **kwargs):
        是否可写
        pass

    def write(self, *args, **kwargs):
        写内容
        pass

    def __getstate__(self, *args, **kwargs):
        pass

    def __init__(self, *args, **kwargs):
        pass

    @staticmethod
    def __new__(*args, **kwargs): # real signature unknown
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

    def __next__(self, *args, **kwargs):
        """ Implement next(self). """
        pass

    def __repr__(self, *args, **kwargs):
        """ Return repr(self). """
        pass

    buffer = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    closed = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    encoding = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    errors = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    line_buffering = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    name = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    newlines = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    _CHUNK_SIZE = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    _finalizing = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

  其中,真正重要的,用得着的是read、readline、readlines、write、tell、seek、flush、close这几个方法。请注意,没有直接修改文件内容的方法。下面介绍一下这几个重点方法:

  1.read():可指定一次读取的数量,比如f.read(10)。如果打开模式没有b,则read的时候以字符为单位进行读取,有b则以字节为单位读取。

  2.write():如果打开模式没有b,则接受普通的字符串为参数;如果有b则需要传入bytes类型的对象。

  3.readline():读入一行,如果打开模式没有b,则返回一行字符串;如果有b,则返回bytes类型。可以指定数量参数。

  4. readlines():将所有文件按行读入,如果打开模式没有b,则返回由各行字符串为元素组成的列表;如果有b,则返回由各行的bytes类型组成的列表。可以指定数量参数。

  5.tell():在打开的文件中,维持着一个位置指针,默认刚开始处于文件的顶端,也就是0位置,在读的过程中,读走多少,指针就移动多少,并且它永远是以字节为单位进行计数。因此在使用时一定要注意编码的问题,否则容易造成读写的乱码。tell方法可以获取当前指针的位置,使用方法,f.tell()。

  6.seek():将指针指向指定的下标处,与tell配合使用,单位是字节。使用方法,f.seek(5)。

  7.flush():将刚写入的内容刷新到本地文件。默认情况下,在文件关闭后,缓存内的数据才会写入本地文件,这样可能会造成数据访问不一致。

三、关闭文件

  为了防止资源泄露,文件破坏,在每次对文件做完操作,我们都要关闭文件。它很简单,文件句柄.close()就可以。

四、with—上下文管理器

  Python的with语法非常棒,它能帮你自动关闭打开的文件,不需要你手动调用close()方法。

  with的基本使用方式如下:

    with open('test.txt','w') as f:

      f.write('str')

  而且在2.7以后的版本中,它还支持同时打开多个文件。

    with open('log1') as obj1, open('log2') as obj2:

      pass
  with不但能管理文件,还能管理别的对象。

五、文件的迭代

  当文件被打开后,可以对文件进行逐行迭代:

  for line in f:

    pass

Python文件操作详解的更多相关文章

  1. Python——文件操作详解

    python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...

  2. python/ORM操作详解

    一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...

  3. Android的file文件操作详解

    Android的file文件操作详解 android的文件操作要有权限: 判断SD卡是否插入 Environment.getExternalStorageState().equals( android ...

  4. python第七篇:Python 列表操作详解

    Python列表操作详解 list函数 list()   #生成一个空的列表 list(iterable)  #用可迭代对象初始化一个列表 列表的 and 运算和 or 运算 列表and运算 > ...

  5. python文件读写详解

    # Python3 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, ...

  6. Python字符串操作详解

    菜鸟学Python第五天 流程控制 for循环 while循环 VS for循环: while循环:称之为条件循环,循环的次数取决于条件何时为false for循环:称之为迭代器循环,循环的次数取决于 ...

  7. Opencv YAML和XML格式文件操作详解

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/47660943 本文参考Opencv 2 ...

  8. android中的文件操作详解以及内部存储和外部存储(转载)

    原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安 ...

  9. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

     上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

随机推荐

  1. NAS服务器局域网内IPad、手机、电视盒子等联网播放

    为把各个移动硬盘和不同电脑的数据进行统一管理,入手了一台希捷 Seagate Business 无内置硬盘 商业级 2盘位 云存储网路存储,经过卖家指点和不断摸索,终于能用了,主要步骤如下: 1. 系 ...

  2. Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法

    Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法 登陆数据库时提示 “ORA-01033”错误在命令窗口以s ...

  3. HDU 3844 Mining Your Own Business

    首先,如果图本来就是一个点双联通的(即不存在割点),那么从这个图中选出任意两个点就OK了. 如果这个图存在割点,那么我们把割点拿掉后图就会变得支离破碎了.对于那种只和一个割点相连的块,这个块中至少要选 ...

  4. 在DataTable中执行DataTable.Select("条件")返回DataTable;

    转:http://blog.csdn.net/hcf_force/article/details/7779062 1.在DataTable中执行DataTable.Select("条件&qu ...

  5. 如何让Targetprocess 中 webhook 推送comment 到指定的项目

    Targetprocess 作为Agile管理工具非常好使.我们用TP + bearychat来做任务的沟通. TP目前是不支持comment push到指定的项目,因为其带出的字段中没有相关项目.但 ...

  6. Navi.Soft30.开放平台.腾讯.开发手册

    1系统简介 1.1功能简述 现在是一个信息时代,并且正在高速发展.以前获取信息的途径非常少,可能只有电视台,收音机等有限的来源,而现在的途径数不胜数,如:QQ,微信,官方网站,个人网站等等 本开发手册 ...

  7. 如何修改 EM12c 中 SYSMAN 用户的密码?

    以下内容全部转自:http://www.chenjunlu.com/2013/04/how-to-modify-the-password-for-sysman-of-em-12c-cloud-cont ...

  8. .net_ckeditor+ckfinder的图片上传配置

    CKEditor和CKFinder的最新版可以到官方网站(http://cksource.com)上下载获得. 把以上两个资源放到网站的根目录: /CKEditor 和 /CKFinder (不区分大 ...

  9. Visual Studio 新建项目报错" this template attempted to load component assembly 'NuGet.VisualStudio.Interop, ….".

    "Error: this template attempted to load component assembly 'NuGet.VisualStudio.Interop, Version ...

  10. mac os x 安装mysql遇到 Access denied for user 'root'@'localhost' (using password: YES)的解决方法

    最近把开发环境迁移到macbook上,装上mysql启动之后,连接,总是报这个错误.5.5的版本默认密码为空.其实这个错误是root未授权的问题.解决方法如下: 未给localhost root用户授 ...