深入Python3 (Dive Into Python3)笔记11--文件
2010年12月01日
尚未出师,博客内容犹如笔记,比较杂乱简略
a_file = open('examples/chinese.txt', encoding='utf-8') 在这个例子中,目录路径中使用的是斜杠(forward slash),但是我并没有说明我正在使用的操作系统。Windows使用反斜杠来表示子目录,但是Mac OS X和Linux使用斜杠。但是,在Python中,斜杠永远都是正确的,即使是在Windows环境下。 如果你需要获得默认编码的信息,则导入locale模块,然后调用locale.getpreferredencoding()。在我安装了Windows的笔记本上,它的返回值是'cp1252',但是在我楼上安装了Linux的台式机上边,它返回'UTF8'。你看,即使在我自己家里我都不能保证一致性(consistency)!你的运行结果也许不一样(即使在Windows平台上),这依赖于操作系统的版本和区域/语言选项的设置。这就是为什么每次打开一个文件的时候指定编码方式是如此重要了。 也许你会感到意外,再次读取文件不会产生一个异常。Python不认为到达了文件末尾(end-of-file)还继续执行读取操作是一个错误;这种情况下,它只是简单地返回一个空字符串。 由于你依旧在文件的末尾,继续调用read()方法只会返回一个空字符串。
seek()方法使定位到文件中的特定字节。
read()方法可以使用一个可选的参数,即所要读取的字符个数。
只要愿意,你甚至可以一次读取一个字符。
a_file.tell()
你是否已经注意到了?seek()和tell()方法总是以字节的方式计数,但是,由于你是以文本文件的方式打开的,read()方法以字符的个数计数。中文字符的UTF-8编码需要多个字节。而文件里的英文字符每一个只需要一个字节来存储,所以你可能会产生这样的误解:seek()和read()方法对相同的目标计数。而实际上,只有对部分字符的情况是这样的。 流对象a_file仍然存在;调用close()方法并没有把对象本身销毁。所以这并不是非常有效。 从技术上说,with语句创建了一个运行时环境(runtime context)。在这几个样例中,流对象的行为就像一个上下文管理器(context manager)。Python创建了a_file,并且告诉它正进入一个运行时环境。当with块结束的时候,Python告诉流对象它正在退出这个运行时环境,然后流对象就会调用它的close()方法。请阅读 附录B,"能够在with块中使用的类"以获取更多细节。
with语句不只是针对文件而言的;它是一个用来创建运行时环境的通用框架(generic framework),告诉对象它们正在进入和离开一个运行时环境。如果该对象是流对象,那么它就会做一些类似文件对象一样有用的动作(就像自动关闭文件!)。但是那个行为是被流对象自身定义的,而不是在with语句中。还有许多跟文件无关的使用上下文管理器(context manager)的方法。在这章的后面可以看到,你甚至可以自己创建它们。 其实你可以舒口气了,因为Python默认会自动处理行的结束符。如果你告诉它,"我想从这个文本文件一次读取一行,"Python自己会弄明白这个文本文件到底使用哪种方式标记新行,然后正确工作。
如果想要细粒度地控制(fine-grained control)使用哪种新行标记符,你可以传递一个可选的参数newline给open()函数。请阅读open()函数的文档以获取更多细节。
print('{:>4} {}'.format(line_number, a_line.rstrip()))
使用字符串的format()方法,你可以打印出行号和行自身。格式说明符{:>4}的意思是"使用最多四个空格使之右对齐,然后打印此参数。"变量a_line是包括回车符等在内的完整的一行。字符串方法rstrip()可以去掉尾随的空白符,包括回车符。 你是否注意到当你在打开文件用于写入数据的时候传递给open()函数的encoding参数。它"非常重要",不要忽略了!就如你在这章开头看到的,文件中并不存在字符串,它们由字节组成。只有当你告诉Python使用何种编码方式把字节流转换为字符串,从文件读取"字符串"才成为可能。相反地,写入文本到文件面临同样的问题。实际上你不能直接把字符写入到文件;字符只是一种抽象。为了写入字符到文件,Python需要知道如何将字符串转换为字节序列。唯一能保证正确地执行转换的方法就是当你为写入而打开一个文件的时候,指定encoding参数。 用二进制模式打开文件很简单,但是很精细。与文本模式唯一不同的是mode参数包含一个字符'b'。
然而,确实有不同之处:二进制的流对象没有encoding属性。你能明白其中的道理的,对吧?现在你读写的是字节,而不是字符串,所以Python不需要做转换工作。从二进制文件里读出的跟你所写入的是完全一样的,所以没有执行转换的必要。 a_file = io.StringIO(a_string) 为了从字符串创建一个流对象,可以把想要作为"文件"使用的字符串传递给io.StringIO()来创建一个StringIO的实例。 你应该问题以二进制模式打开gzip压缩文件。(注意mode参数里的'b'字符。)
我在Linux系统上完成的这个例子。如果你对命令行不熟悉,这条命令用来显示刚才你在Python shell创建的gzip压缩文件的"长清单(long listings)",你可以看到,它有79个字节长。而实际上这个值比一开始的字符串还要长!由于gzip文件包括了一个固定长度的文件头来存放一些关于文件的元数据(metadata),所以它对于极小的文件来说效率不高。
gunzip命令(发音:"gee-unzip")解压缩文件然后保存其内容到一个与原来压缩文件同名的新文件中,并去掉其.gz扩展名。
cat命令显示文件的内容。当前文件包含了原来你从Python shell直接写入到压缩文件out.log.gz的那个字符串。
标准输出和标准错误(通常缩写为stdout和stderr)是被集成到每一个类UNIX操作系统中的两个管道(pipe),包括Mac OS X和Linux。当你调用print()的时候,需要打印的内容即被发送到stdout管道。当你的程序出错并且需要打印跟踪信息(traceback)时,它们被发送到stderr管道。默认地,这两个管道都被连接到你正在工作的终端窗口上(terminal window);当你的程序打印某些东西,你可以在终端上看到这些输出,当程序出错,你也可以从终端上看到这些错误信息。在图形化的Python shell里,stdout和stderr管道默认连接到"交互式窗口(Interactive Window)" sys.stdout和sys.stderr都是流对象,尽管他们只支持写入。但是他们是变量而不是常量。这就意味着你可以给它们赋上新值 - 任意其他流对象 - 来重定向他们的输出。
as子句(clause)到哪里去了?其实with语句并不一定需要as子句。就像你调用一个函数然后忽略其返回值一样,你也可以不把with语句的上下文环境赋给一个变量。在这种情况下,我们只关心RedirectStdoutTo上下文环境的边际效应(side effect)。
那么,这些边际效应都是些什么呢?我们来看一看RedirectStdoutTo类的内部结构。这是一个用户自定义的上下文管理器(context manager)。任何类只要定义了两个特殊方法:code>__enter__()和__exit__()就可以变成上下文管理器。
发表评论
-
Python GUI编程-了解相关技术[整理]
2012-01-20 09:39 1150Python GUI编程-了解相关技术[整理] 2011年0 ... -
Python笔记――python简介、特点、安装及helloworld
2012-01-20 09:39 663Python笔记――python简介 ... -
给C++程序员的Python初学指南 / Guide to Python for C++ Programmers
2012-01-20 09:39 735给C++程序员的Python初学指南 / Guide to P ... -
eclipse开发python+qt
2012-01-20 09:39 1101eclipse开发python+qt 2011年05月12日 ... -
穿越亚细亚行笺[18国家和地区旅行攻略]-转
2012-01-19 14:42 938穿越亚细亚行笺[18国家 ... -
外贸找客户的几十种方法,总有一种适合你
2012-01-19 14:42 1699外贸找客户的几十种方法,总有一种适合你 2011年08月20 ... -
办签证
2012-01-19 14:42 491办签证 2011年11月17日 去越南属于出国,必须办理 ... -
告别光棍有新法
2012-01-19 14:42 538告别光棍有新法 2011年02月28日 越 ... -
MFC消息处理和消息映射的概念
2012-01-17 04:27 652MFC消息处理和消息映射的概念 2011年08月25日 ... -
Windows SDK编程(Delphi版) 之 消息处理
2012-01-17 04:27 498Windows SDK编程(Delphi版) ... -
VC消息映射
2012-01-17 04:27 576VC消息映射 2010年08月14 ... -
在.net中基于Windows消息的IPC实现
2012-01-17 04:27 533在.net中基于Windows消息的IPC实现 2011年0 ... -
VC++日记(非模态,自定义消息,窗体移动……)
2012-01-17 04:27 995VC++日记(非模态,自定义消息,窗体移动……) 2011年 ... -
根在故乡
2012-01-16 03:17 657根在故乡 2011年12月06日 ... -
我心中完美男人的形象
2012-01-16 03:17 554我心中完美男人的形象 2011年12月18日 一 ... -
■反击关于盗墓一点也不腐つ
2012-01-16 03:17 593■反击关于盗墓一点也不腐つ 2012年01月07日 首先 ...
相关推荐
dive-into-machine-learning, 使用 python Jupyter笔记本和scikit学习深入机器学习 ! 深入机器学习 本指南是给你的: ! 你对机器学习的 。 你知道。( 至少是基本的basics ! 如果你想了解更多的python,请尝试使用...
Dive Into Python 是为有经验的程序员编写的一本 Python 书。这是我在看这本书时作的笔记。
Dive Into Python 是为有经验的程序员编写的一本 Python 书。这是我的学习笔记。
Dive into CPython internals, trying to illustrate every detail of CPython implementation | CPython 源码阅读笔记, 多图展示底层实现细节
Dive Into Python.chm python-2.7.2.chm Python Programming on Win32 .chm Python核心编程.pdf Python精要参考.pdf Python学习笔记整理.chm 简明python教程.chm wxpython-2.8.7.1-api.chm wxpython-in-action-zh....
Python中文资料大集合 都郁闷死... 简单介绍一下哈: python入门,python程序员指南,python2.5官方指南,简明python教程,python学习笔记,python教学文件,Dive.Into.Python-zh-cn-5.4-with-code.chm<br>等等~~~
Learn-Dive-into-DL-PyTorch │ ├── Code │ │ ├── CNN │ │ ├── GAN │ │ ├── Language-Model │ │ ├── Lecture1-Linear-model │ │ ├── Lecture2-Softmax │ │ ...
NoteCase 又叫 Outliner(大纲),它是一个按照树状结构来组织文档内容的笔记管理程序,...譬如我现在正在认真阅读 《DIVE INTO PYTHON》,我可以利用 NoteCase 树状文档组织结构,将我所阅读的章节分别建立相应结点。
- This project reproduces the book Dive Into Deep Learning - 记录Learning from data一书中的习题解答 - 《统计学习方法》的代码实现 - 北邮《Python编程与实践》课程资料 - 北京邮电大学“网络搜索原理”课程...
CPython 源码阅读笔记, 多图展示底层实现细节 Dive into CPython internals, trying to illustrate every detail of CPython implementation