Python核心编程学习日记之文件和输入输出

文件和输入输出

  1. 文件对象
    1. 泛义的文件对象:具有文件类型接口的对象,例如文件,Web网页,通讯。文件就是连续的字节序列。数据的传输经常用到字节流。
    2. open(): file_object = open(file_name, access_mode = 'r', buffering = -1)。 file_name可以是相当路径或是绝对路径。file()和open()功能完全可以替换。
    3. 通用换行符支持(UNS):当使用‘U’标志打开文件时,所有的行分隔符通过Python的输入方法返回时都会被替换为换行符NEWLINE(\n)。文件对象具有newlines属性。UNS只用于读取文本文件,没有对应的处理文件输出的方法.
    4. 有关二进制文件和文本文件的讨论在笔记的末尾
  2. 文件内建方法

    文件方法分为四类:输入,输出,文件内移动,杂项操作

    1. 输入:

      read()方法用来直接读取size个字节到字符串中。不指定size,读至文件末尾。(@deprecated)

      readline()方法读取打开文件的一行,将包括行结束符的整行返回为一个字符串。也有size参数

      readlines()方法读取所有(剩余)行,返回字符串列表。sizhint代表返回的最大字节大小

    2. 输出:

      write()含有文本数据或二进制数据块的字符串写入到文件中

      writelines()将一个字符串列表写入文件,但是行结束符不会自动加入行尾。需要自己处理列表中的字符串

      read()和readlines()读取行,不会自行删去行分隔符,write()和writelines()写入时不会自行加入行分隔符,都需要程序员自行操作。

    3. 文件内移动:

      seek()可以再文件中移动文件指针到不同的位置。offset字节代表相对于某个位置的偏移量。位置的默认值为0,代表从文件开头算起,1代表从当前位置,2代表从文件末尾。(类似fseek())。

      text()方法告诉当前文件指针在文件中的位置,从文件起始算起,单位为字节。

    4. 文件方法杂项:

      close()显示关闭文件来结束对它的访问。尽早的释放句柄是个好习惯,避免对资源的空闲占用。不显示关闭文件,可能丢失输出缓冲区的数据

      fileno()返回打开文件的描述符。flush()方法会直接把内部缓冲区的数据立刻写入文件。truncate()方法将文件截取到当前文件指针位置或者到给定size,以字节为单位。

      行分隔符和其他文件系统差异:Posix系统上,行分隔符是换行符NEWLINE(‘\n’)字符,旧的MacOS下是RETURN(\r),DOS和Wind32系统结合使用两者(\r\n)。路径分隔符Posix使用“/”,Dos和Windows使用“\”,旧的MacOS使用“:”。导入os模块,跨平台时会有差异的变量自动会被设置为正确的值。

      print语句默认在输出内容末尾加一个换行符,在语句后加一个逗号可以取消这个行为。truncate()方法接受可选size作为参数,如果给定,文件将被截取到最多size字节处。没有,则截取到当前文件指针位置。tell()会返回开始截取的字节位置。

      标准文件:标准输入(一般是键盘),标准输出(到显示器的缓冲输出),标准错误(到屏幕的非缓冲输出),命名同c,stdin,stdout,stderr。访问句柄:导入sys模块,使用sys.stdin,sys.stdout,sys.stderr.print语句通常是输出到sys.stdout.内建的raw_input()通常从sys.stdin接受输入。

      sys.argv属性提供对命令行参数的访问。命令行参数是调用某个程序时除程序名以外的其它参数。sys.argv[0]永远是程序的名称

      os模块式访问操纵系统功能的主要接口。os模块还负责处理大部分的文件系统操作,包括删除/重命名文件,遍历目录树,以及管理文件访问权限等。os.path 可以完成一些针对路径名的操作. 它提供的函数可以完成管理和操作文 件路径名中的各个部分, 获取文件或子目录信息, 文件路径查询等操作.

  3. 永久存储模块

    数据的扁平化(或者数据的序列化,数据的顺序化)将比基本类型复杂的对象转换为一个二进制数据集合,这样就可以把数据集合保存起来或通过网络发送,然后再重新把数据集合恢复原来的对象格式。

    1. DBM风格的模块:

      多种实现:dbhash/bsddb,dbm,gdbm,dumbdbm.建议使用anydbm模块,它会自动选择最合适的。它们只能存储字符串,不能对Python对象进行序列化

    2. shelve模块:

      shelve模块使用anydbm选择最适合的DBM模块,然后使用cPickle来完成对存储转换过程。

    3. pickle和cPickle

      使用pickle模块吧Python对象直接保存到文件里。无需关心其他。pickle模块中两个函数:dump()和load()。dump()接受一个文件句柄和一个数据对象作为参数,把数据对象以特定格式保存到给定文件里。load()函数从文件取出保存的对象。cPickle是pickle的一个更快的c语言编译版本

错误和异常

  1. 检测和处理异常

    try-except:语句语法:

    try: 
    try_suite # watch for exceptions here 
    except Exception[,reason]: 
    except_suite # exception-handling code 

    一个try当然可以带有多个except,用来分别处理多种类型的异常。一个except要处理多种异常,异常要被放在一个元组里

    当函数没有显式的返回一个值时,它就返回None

    捕获所有普通异常:except Exception:或者使用裸except子句 except:(不推荐@deprecated)

    sys.exc_info()返回最近一个被except语句捕获的异常的信息。

    两种特殊异常:SystemExit 是由于当前 Python 应用程序需要退出, KeyboardInterupt 代表用户按下了 CTRL-C (^C) , 想要关闭 Python .他们与Exception平级。要接受包括他们的所有异常,使用裸except或者except BaseException

二进制文件和文本文件返回原处

作为文件的数据,在计算机中都是以二进制的形式存储的,对于文本文件和二进制文件的区分,不是在物理上的,而是在逻辑上的。

文本文件是字符序列,是基于字符编码的,存储的是字符的编码(如ASCII码)序列;二进制文件时字节序列,是基于值编码的,或者说没有什么特别的编码,它同数据在内存中的形式相同,仅仅是二进制数组成的字节序列。

区别
  1. “文本文件、二进制文件”和“以文本方式打开、以二进制方式打开”是完全不同的概念。
  2. 是否以二进制方式打开文件,即调用fopen时是否带b,对使用fwrite以二进制方式写入的结果没有影响,不论是在Linux下还是在Windows下;对使用fprintf以文本方式写入的结果仅在Windows下有影响,影响结果就是不带b时会有‘\n'到'\r\n'的转换,带b时没有这个转换,对在Linux下的写入没有影响。
  3. 文本工具打开文件过程:首先读取文件物理上所对应的的二进制比特流,然后按照协议规定的解码方式来解释这个流,然后将解释结果显示出来。比如按照ASCII码形式,他会8个bit8个bit的解释文件流。

感觉就是在Linux下不要管它,在windows下,如果不是以b的mode打开,换行符当成'\n'处理就行了。什么'\r\n'与‘\n’的转换,后台都处理好了。以b的mode读取,就要考虑'\r\n'的情况。。。这篇文章写的很不错。。

 

原文地址:https://www.cnblogs.com/xyqhello/p/2866016.html