技术开发 频道

详解Python 3.1新变化之核心语言篇

  五、改进的WITH语句

  在Python 2.5中,WITH语句是作为一个__future__特性引入的,该语句的正式引入实际上是从Python 3.0开始的。到了Python 3.1版本,该语句已经能够支持更多的资源。最常见的情形是,它可以打开输入、输出文件并在处理完成后关闭它们。在Python 3.0中,我们要么使用嵌套的with语句,要么显式闭合在文件中。下面是一个Python 3.0的例子,它打开了一个输入文件,将其内容作为字符串读取,用字符串的title()方法处理内容,并将结果写到一个输出文件中。

  这个示例中含有两个嵌套的with语句,注意嵌套的with语句中的最后一行。当代码试图读取out.txt的时候,结果为空,因为此文件是被缓冲处理的,并且还没有写入。当此with语句完成的时候,Python会关闭此文件,所以最后一行代码会认定out.txt的内容的确是大写文字。

  open('in.txt', 'w').write('abc def')

  with open(
'in.txt') as in_file:

  with open(
'out.txt', 'w') as out_file:

  text
= in_file.read()

  
assert text == 'abc def'

  text
= text.title()

  
assert text == 'Abc Def'

  out_file.write(text)

  
assert open('out.txt').read() == ''

  
assert open('out.txt').read() == 'Abc Def'

  看到嵌套的with语句,是不是感觉有点头疼,呵呵。接下来,我们要打开两个两个文件,并在处理完成后关闭它们(如果您需要打开三个文件,那么就需要三个嵌套的with语句)。 Python 3.1运行您使用单个WITH语句打开所有文件:

  open('in.txt', 'w').write('abc def')

  with open(
'in.txt') as in_file:

  with open(
'out.txt', 'w') as out_file:

  text
= in_file.read()

  
assert text == 'abc def'

  text
= text.title()

  
assert text == 'Abc Def'

  out_file.write(text)

  
assert open('out.txt').read() == ''

  
assert open('out.txt').read() == 'Abc Def'

  Python 3.1的另一项改进就是,gzip.GzipFile和bz2.BZ2File现在也能用于WITH语句。我们知道,这些都是压缩后的文件格式。下面的示例代码将使用gzip文件和bz2文件来存储5000个字节的内容,并显示其尺寸。这里还有用到一些额外的Python 3特性,比如带有命名属性的统计结果和高级字符串格式化。

from bz2 import BZ2File
from gzip import GzipFile
import os
with GzipFile(
'1.gz', 'wb') as g, BZ2File('1.bz2', 'wb') as b:
  g.write(b
'X' * 5000)
  b.write(b
'X' * 5000)
for ext in ('.gz', '.bz2'):
  filename
= '1' + ext
  
print ('The size of the {0} file is {1.st_size} bytes'.format(ext, os.stat(filename)))

  输出的结果:

The size of the .gz file is 43 bytes
The size of the .bz2 file
is 45 bytes

  六、小结

  Python 3.0发布七个月之后,Python核心开发人员于2009年6月27日发布了新的Python 3.1版本。虽然此3.1版本只是对Python 3.0的一次小型升级,但是它不仅为开发者带来许多让人感兴趣的特性,同时在性能方面也有所改善。本文为读者详细介绍了Python 3.1版本在核心语言方面的变化,在接下来的文章中,我们将继续为读者介绍新版本中标准程序库和性能改善方面的变化。

0
相关文章