您的位置:首页 > 编程语言 > Python开发

python 学习笔记(10)重构与文件处理

2013-05-12 12:41 681 查看
 

声明:本文系本人学习python3总结,如有侵权等,请及时告知;

                       欢迎转载:请保留http://blog.csdn.net/kevinx_xu/article/details/8916644

 

一、重构

         重构是修改可运作代码,使其表现更佳的过程。通常,“更佳”指的是“更快”,但它也可能指的是“占用更少内存“、”占用更少磁盘空间“或者”更加简洁”。对于你的环境、你的项目来说,无论重构意味着什么,它对程序的长期健康都至关重要。

         1、python 3.1对字符串格式化的改进

从 Python 3.1 起,在格式化标示符中使用位置索引时可以忽略数字。也就是说,无需使用格式化标示符 {0} 来指向 format() 方法的第一个参数,只需简单地使用 {} 而 Python 将会填入正确的位置索引。该规则适用于任何数量的参数;第一个 {} 代表 {0},第二个 {} 代表 {1},以此类推。

         2、对于需用正则表达式来解析的事情,越简单效率越高,必要时查表操作是最高效的,虽然在表项建立的时候比较慢,但是为后续的工作节省很多很多的运算与时间;

二、文件

         文件是每一个主流操作系统的主要存储模型;这种观念如此根深蒂固以至于难以想出一种替代物。

         1、打开文件;

         Python有一个内置函数 open(),它使用一个文件名作为其参数。

         open(...)

   open(file, mode='r', buffering=-1, encoding=None,

        errors=None, newline=None, closefd=True) -> file object

         2、文件不一定需要在本地磁盘上。也许你挂载了一个网络驱动器。它也可以是一个完全虚拟的文件系统(an entirely virtual filesystem)上的文件。只要你的操作系统认为它是一个文件,并且能够以文件的方式访问,那么,Python就能打开它。

         3、字符编码

         字节即字节;字符是一种抽象。字符串由使用Unicode编码的字符序列构成。但是磁盘上的文件不是Unicode编码的字符序列。文件是字节序列。        

         注意:默认的编码方式是平台相关的

         获取默认编码信息:如果你需要获得默认编码的信息,则导入locale模块,然后调用

locale.getpreferredencoding()。获取当前系统的首选字符编码

         4.mode 属性会告诉你被打开文件的访问模式。你可以传递一个可选的mode参数给open()函数。

        注意:

        这个mode和C语言中用fopen()打开文件所用的属性是一样的;

        在pyhton3.1以后不支持file函数去打开文件了,打开文件必须去用open()

  关于open模式:
                 w
以写方式打开,

                a 以追加模式打开 (从 EOF开始,必要时创建新文件)

                r+ 以读写模式打开

               w+ 以读写模式打开 (参见 w )

               a+ 以读写模式打开 (参见 a )

               rb 以二进制读模式打开

               wb 以二进制写模式打开(参见 w )

               ab 以二进制追加模式打开(参见 a )

               rb+ 以二进制读写模式打开(参见 r+ )

               wb+ 以二进制读写模式打开(参见 w+ )

               ab+ 以二进制读写模式打开(参见 a+ )
 

         5.file.read method

                   file.read() 如果不传递参数,将一次读取到文件的末尾;

                   file.read(size)每一次读取size大小的数据,并且返回

                   file.readline()每一次读取一行的数据

                   file.readline(size)读一行,如果定义了size,有可能返回的只是一行的一部分

                   file.readlines()如果不传递参数,将一次读取到文件的末尾;

                   filereadlines(把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。)

         6.file.tell()返回当前文件读取的位置到文件头部的长度;

         7.file.seekable()判断文件是否可以用file.seek()

           file.seek(size)
如果参数为1个,则从文件头开始计算,偏移size大小

           file.seek(size,whence),如果参数为2个,whence是从什么位置开始偏移.

                  whence = 0.从文件头开始偏移,偏移size大小

                  whence=1.
从当前操作开始偏移,偏移size大小

                  whence = 2.从文件尾开始偏移,偏移size大小

         8、file writemethod

                   file.write(str)   #把str写到文件中,write()并不会在str后加上一个换行符

         file.writelines(seq)  #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。

 

    9.
file.close()#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
         file.flush()#把缓冲区的内容写入硬盘
         file.fileno()#返回一个长整型的”文件标签“
         file.isatty()#文件是否是一个终端设备文件(unix系统中的)
         file.next()返回下一行,并将文件操作标记位移到下一行。把一个file用于for
… infile这样的语句时,就是调用next()函数来实现遍历的。
         file.truncate([size])#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
10、file.closed

已经关闭了的流对象确实还有一个有用的属性:closed用来确认文件是否已经被关闭了

11、自动关闭文件

         try..finally也行。但是with更好  

         with... as

         eg:

         >>>with open('./Makefile','r+', encoding = locale.getpreferredencoding()) as file:

         ...     file.readline()     

         ...

         '#Put some miscellaneous rules here\n'

         这段代码调用了open()函数,但是它却一直没有调用file.close()。with语句引出一个代码块,就像if语句或者for循环一样。在这个代码块里,你可以使用变量file
作为open()函数返回的流对象的引用。read(),无论你想要调用什么。当with块结束时,Python自动调用a_file.close()。

         流对象有一个显式的close()方法,但是如果代码有缺陷,在调用close()方法以前就崩溃了呢?理论上,那个文件会在相当长的一段时间内一直打开着,这是没有必要地。也是不安全的。

         1)Python 2有一种解决办法:try..finally块。这种方法在Python 3里仍然有效,也许你可以在其他人的代码,或者从比较老的被移植到Python 3的代码中看到它。

         无论你以何种方式跳出with块,Python会自动关闭那个文件…即使是因为未处理的异常而“exit”。是的,即使代码中引发了一个异常,整个程序突然中止了,Python也能够保证那个文件能被关闭掉。 

         2)为了一次读取文件的一行,使用for循环。是的,除了像read()这样显式的方法,流对象也是一个迭代器(iterator),它能在你每次请求一个值时分离出单独的一行。  

         3)格式说明符{:>4}的意思是“使用最多四个空格使之右对齐

        注意:其实with语句并不一定需要as子句。就像你调用一个函数然后忽略其返回值一样,你也可以不把with语句的上下文环境赋给一个变量

 

12、二进制流没有enconding属性

三、IO模块

         importio

         1、io模块定义了StringIO类,你可以使用它来把内存中的字符串当作文件来处理。

         2、io.StringIO让你能够将一个字符串作为文本文件来看待。另外还有一个io.ByteIO
类,它允许你将字节数组当做二进制文件来处理。

 四、处理压缩文件

         Python标准库包含支持读写压缩文件的模块。有许多种不同的压缩方案;其中,gzip和bzip2是非Windows操作系统下最流行的两种压缩方式。  

         1、gzip模块允许你创建用来读写gzip压缩文件的流对象。该流对象支持read()方法(如果你以读取模式打开)或者write()方法(如果你以写入模式打开)。这就意味着,你可以使用从普通文件那儿学到的技术来直接读写gzip压缩文件,而不需要创建临时文件来保存解压缩了的数据。

         与普通文件最大的区别就是需要导入

         importgzip

         打开时候用gzip.open()用二进制的形式打开;

         具体使用,dir(gzip)+help(gzip.method)

五、标准输入、输出和错误

         sys.stdin, sys.stdout, sys.stderr.  

就是C中的stdin stdout stderr

         1、标准输入输出重定向

                   1)用open()打开一个文件,将sys.stdin/sys.stdout/sys.stderr重新定向到一个文件。

                   eg:sys.stdin = open('./stdin.txt','r+', encoding = locale.getpreferredencoding())

                      sys.stdout = open('./stdout.txt','a+',encoding = locale.getpreferredencoding())

                      sys.stderr = open('./stderr.txt','w+',encoding = locale.getpreferredencoding())

                  
2)上下文环境

                           
上下文管理器(context manager)。任何类只要定义了两个特殊方法:code>__enter__()和__exit__()就可以变成上下文管理器。

                              __enter__()方法是一个特殊的类方法(special class method);在进入一个上下文环境时Python会调用它

                              __exit__()是另外一个特殊类方法;当离开一个上下文环境时(Python会调用它。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: