目录| 上一节(1.5 列表) | 下一节 (1.7 函数)html
大多数的程序须要从某处读取输入。本节讨论文件访问。python
打开一个文件:git
f = open('foo.txt', 'rt') # Open for reading (text) g = open('bar.txt', 'wt') # Open for writing (text)
读取全部的数据:github
data = f.read() # Read only up to 'maxbytes' bytes data = f.read([maxbytes])
写入一些文本:bash
g.write('some text')
当你完成操做后,关闭文件:函数
f.close() g.close()
文件应该被正确的关闭,这是很容易忘记的一个步骤。所以,首选方法是像下面这样使用 with
语句:学习
with open(filename, 'rt') as file: # Use the file `file` ... # No need to close explicitly ...statements
当控制流离开缩进的代码块时,这将会自动关闭文件。编码
以字符串的形式一次性读取整个文件:翻译
with open('foo.txt', 'rt') as file: data = file.read() # `data` is a string with all the text in `foo.txt`
经过迭代逐行读取文件:code
with open(filename, 'rt') as file: for line in file: # Process the line
写入字符串数据:
with open('outfile', 'wt') as out: out.write('Hello World\n') ...
重定向 print() 函数:
with open('outfile', 'wt') as out: print('Hello World', file=out) ...
本练习依赖于 Data/portfolio.csv
文件。该文件由一行一行的关于股票投资组合的信息构成。假定你是在 practical-python/Work/
目录下进行操做。若是你不肯定本身所在的目录,你能够经过执行如下操做找出 Python 运行的目录:
>>> import os >>> os.getcwd() '/Users/beazley/Desktop/practical-python/Work' # Output vary >>>
首先,尝试以字符串的形式一次性读取整个文件:
>>> with open('Data/portfolio.csv', 'rt') as f: data = f.read() >>> data 'name,shares,price\n"AA",100,32.20\n"IBM",50,91.10\n"CAT",150,83.44\n"MSFT",200,51.23\n"GE",95,40.37\n"MSFT",50,65.10\n"IBM",100,70.44\n' >>> print(data) name,shares,price "AA",100,32.20 "IBM",50,91.10 "CAT",150,83.44 "MSFT",200,51.23 "GE",95,40.37 "MSFT",50,65.10 "IBM",100,70.44 >>>
在上面的示例中,应注意 Python 有两种输出模式。在第一种模式下,你在提示符后输入 data
,Python 向你展现包含引号和转义码的原始字符串。当你输入 print(data)
时,你得到真正的字符串的格式化输出。
一次性读取文件很简单,但这一般不是最恰当的读取文件方式——尤为是当文件碰巧很大或者文件包含要一次性处理的文本行时。
要逐行读取文件,能够像下面这样使用 for 循环:
>>> with open('Data/portfolio.csv', 'rt') as f: for line in f: print(line, end='') name,shares,price "AA",100,32.20 "IBM",50,91.10 ... >>>
当你像上面展现的那样使用此代码时,它会读取文件的每一行,直到到达文件末尾。在文件末尾,循环会中止。
在某些特定的状况下,你可能想要手动的读取或者跳过某一行文本(例如,可能你想跳过列标题的第一行):
>>> f = open('Data/portfolio.csv', 'rt') >>> headers = next(f) >>> headers 'name,shares,price\n' >>> for line in f: print(line, end='') "AA",100,32.20 "IBM",50,91.10 ... >>> f.close() >>>
next()
函数返回文件中的下一行文本。若是你反复调用该函数,将会得到连续的行。可是,如你所知,for
循环已经使用 next()
函数获取数据了。因此,一般状况下,除非你像上面展现的那样试图显式跳过或者读取一行,不然,不要直接调用 next()
函数。
一旦读取文件的各行,你就能够开始执行更多的操做,例如拆分。
示例,尝试如下操做:
>>> f = open('Data/portfolio.csv', 'rt') >>> headers = next(f).split(',') >>> headers ['name', 'shares', 'price\n'] >>> for line in f: row = line.split(',') print(row) ['"AA"', '100', '32.20\n'] ['"IBM"', '50', '91.10\n'] ... >>> f.close()
注意:在这些示例中,由于没有使用 with
语句,因此 f.close()
被显式的调用。
如今你已经知道如何读取文件,让咱们编写一个程序来执行简单的计算。
portfolio.csv
文件里面的列对应股票的名称,股票的数量以及单支股票持有的购买价格。编写一个名为 pcost.py
的程序来打开这个文件,读取全部的行而且计算在全部的股票投资组合中花费多少钱来购买这些股份。
提示:要将字符串转为整数,使用 int()
函数。要将字符串转为浮点数,使用 float()
函数。
你的程序应该打印以下输出:
Total cost 44671.15
若是你想读取非文本文件(如 gzip 压缩的数据文件)怎么办?虽然内建 open()
函数在这里帮不了你了,可是 Python 提供的 gzip
模块能够读取 gzip 文件。
试试看:
>>> import gzip >>> with gzip.open('Data/portfolio.csv.gz', 'rt') as f: for line in f: print(line, end='') ... look at the output ... >>>
注意:此处包含 'rt'
文件模式相当重要。若是你忘记使用它,你将会获得字节字符串而不是一般的文本字符串。
数据科学家很快指出,诸如 Pandas 这样的库已经具备读取 CSV 文件的函数,为何不使用 Pandas 呢?的确如此——并且效果也很好。可是,这不是一门有关学习 Pandas 的课程,读取文件是一个比读取 CSV 文件更广泛的问题。咱们使用 CSV 文件作例子的主要缘由是:它是大多数编码人员熟悉的格式,而且相对易于直接使用——在读取 CSV 文件的过程当中,阐明了许多 Python 特性。因此,当你回到工做中,请务必使用 Pandas。可是,在本课程剩下部分,咱们将会继续使用标准的 Python 函数。