读取文件
第一步是将文件读入内存。
第一个示例是一次性读入:
>>> with open('pi_digits.txt') as file_object:
... contents = file_object.read()
...
>>> print(contents)
3.1415926535
8979323846
2643383279
>>> print(contents.rstrip())
3.1415926535
8979323846
2643383279
wiith
和as
是关键字,文件一次性读入file_object
。
使用with
时,打开的文件只能在with所在的代码块可用。
相对路径的起点是当前路径,即python文件执行的路径。
第一个print
多一空行,是因为读到文件尾部时返回一空串。
最后,文件只有open()
没有close()
,通过with打开的文件,python会自动关闭,我们不用去管。
绝对路径和相对路径的概念就不说了。记住Unix下路径用/
,Windows下用\
。
第二个示例是逐行读取,还是用空行的问题。
>>> with open('pi_digits.txt') as file_object:
... for line in file_object:
... print(line)
...
3.1415926535
8979323846
2643383279
以下代码将文件内容存于List中,这样即使脱离了with代码块,仍可访问文件的内容。
>>> with open('pi_digits.txt') as file_object:
... lines = file_object.readlines()
...
>>> for line in lines:
... print(line.rstrip())
...
3.1415926535
8979323846
2643383279
Python读取文本文件时,将所有内容都转变为字符串,如果你需要数字类型,则需做相应的转换。
示例中学到的几点:
>>> names=['flora', 'amy', 'tina', 'grace', 'amy']
>>> 'amy' in names
True
>>> names.count('amy')
2
>>> str='abcdefg'
>>> 'bcd' in str
True
>>> print(names[:3])
['flora', 'amy', 'tina']
写文件
写文件时,open函数必须指定模式,如写(w
),追加(a
)等,默认为只读(r
)。例如模式为w
时会覆盖文件。读写模式为r+
。
>>> filename = '/tmp/1'
>>> with open(filename, 'w') as file_object:
... file_object.write("I love programming.")
...
19
Python写文件只能写字符串。
write函数不带换行符,如果写多行,需要补上\n
。
例外
例外就是Exception对象,这和Java类似。只不过Java是try...catch
,而Python是try...except
。
例外如果不处理,程序会中止。
例外示例,可以看到例外的对象名为ZeroDivisionError
:
>>> 4/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
处理例外:
>>> try:
... 4/0
... except ZeroDivisionError:
... print('not allowed')
...
not allowed
以下为典型的例外处理代码,else部分是可选的:
try:
<你的操作>
except <例外对象名>:
<处理例外>
except <例外对象名>:
<处理例外>
else:
<正常处理>
如果在处理例外时什么都不做,可以使用pass
语句,相当于一个占位符。pass
也可用在别处。
文件不存在引起的例外为FileNotFoundError
。字符串转换为整型时的例外为ValueError。
下一个示例为处理文本,文本是从Project Gutenberg网站获取然后存于本地。
由于文本编码是UTF-8:,打开文件时,需要指定编码:
open(filename, encoding='utf-8')
处理的思路如下:
- open()读入字符串
- 字符串split方法 -> List
- len(List)即单词个数
存储数据
示例使用了json.dump()
和 json.load()
,因此通过import json
引入了模块。虽然示例中只是简单的照原样存取,但这两个函数还可以带很多格式化的选项,详见这里。
最后提到了重构(Refactoring)。作者对重构的定义:
improve the code by breaking it up into a series of functions that have specific jobs
重构可使代码更干净,易理解,易扩展。
关于重构,推荐Martin Fowler写的Refactoring:Improving the Design of Existing Code