[TOC]
*****
读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。
## 10.1.1 读取整个文件
先准备被读取文件,放在和执行文件同一目录下
![](https://img.kancloud.cn/3c/95/3c955264704159457d6581ce98be2d74_185x120.png)
执行读取的程序文件
```
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
```
函数open()接受一个参数:要打开的文件的名称。 Python在当前执行的文件所在的目录中查找指定的文件。 函数open()返回一个表示文件的对象。
关键字with在不再需要访问文件后自动将其关闭
使用方法read()(前述程序的第2行)读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents中。
通过打印contents的值,就可将这个文本文件的全部内容显示出来:
![](https://img.kancloud.cn/67/58/6758d22b16f741d6d111bf9873af2a95_200x95.png)
read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除末尾的空行,可在print语句中使用rstrip()
方法rstrip()删除(剥除)字符串末尾的空白。现在,输出与原始文件的内容完全相同
![](https://img.kancloud.cn/9f/0a/9f0a7604c78e9fefbff11fdebad5c946_148x89.png)
## 10.1.2 文件路径
当你将类似pi_digits.txt这样的简单文件名传递给函数open()时, Python将在当前执行的文件(即.py程序文件)所在的目录中查找文件。
相对文件路径让Python到指定的位置去查找,而该位置是相对于当前运行的程序所在目录的。
Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/)
```
with open('text\_files\\filename.txt') as file_object:
```
将文件在计算机中的准确位置告诉Python,这样就不用关心当前运行的程序存储在
什么地方了。这称为绝对文件路径
```
**在winows中**
file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt'
with open(file_path) as file_object:
```
## 10.1.3 逐行读取
读取文件时,常常需要检查其中的每一行。以每次一行的方式检查文件,可对文件对象使用for循环:
```
filename = 'pi_digits.txt'
#给返回的文件对象命名为file_object
with open(filename) as file_object:
# 执行循环来遍历文件中的每一行
for line in file_object:
print(line)
```
我们打印每一行时,发现空白行更多了
![](https://img.kancloud.cn/33/90/3390d3c0a0b5b858f2ba7cc4c7b4b673_230x80.png)
![](https://img.kancloud.cn/88/07/8807964714d0a511786e05767dc6fd20_888x362.png)
## 10.1.4 创建一个包含文件各行内容的列表
使用关键字with时, open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表。
```
filename = 'pi_digits.txt'
with open(filename) as file_object:
#将文件中的每一行存在列表中,该列表被存储到变量lines中
lines = file_object.readlines()
#在with外,循环读取列表中的每一行
for line in lines:
print(line.rstrip())
```
列表lines的每个元素都对应于文件中的一行
![](https://img.kancloud.cn/d4/9d/d49dcf394d809289bbee2b3c3ac66667_858x123.png)
## 10.1.6 包含一百万位的大型文件
前面我们分析的都是一个只有三行的文本文件,但这些代码示例也可处理大得多的文件。如果我们有一个文本文件,其中包含精确到小数点后1 000 000位而不是30位的圆周率值,也可创建一个包含所有这些数字的字符串。为此,我们无需对前面的程序做任何修改,只需将这个文件传递给它即可。