Appearance
文件
从这里开始已经超越基本技能了。
在本章中,将学习处理文件,让程序能够快速地分析大量的数据
1. 从文件读取数据
1.1 读取整个文件
假设要读取的文件是 pi_digits.txt,它的内容如下:
》pi_digits.txt
3.1415926535
8979323846
26433下面的程序打开并读取这个文件,再将其内容显示到屏幕上: 》read_pi_digits.py
python
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)在这个程序中,第1行代码做了大量的工作
- 函数open(): 接受一个参数:要打开的文件的名称; 返回一个表示文件的对象;
- as file_object: 将文件对象赋值给变量file_object;
- 函数read(): 读取文件的全部内容; 将其作为一个长长的字符串存储在变量contents中;
- 函数print(): 将变量contents中的内容显示到屏幕上;结果如下:
3.1415926535
8979323846
26433为何会多出这个空行呢?因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除末尾的空行,可在print语句中使用rstrip(): 》read_pi_digits.py
python
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())1.2 文件路径
当你将类似pi_digits.txt这样的简单文件名传递给函数open()时,Python将在当前执行的文件(即.py程序文件)所在的目录中查找文件。
pi_digits.txt 路径 可能是 /text_files/pi_digits.txt
要让Python打开不与程序文件位于同一个目录中的文件,需要提供文件路径,它让Python到系统的特定位置去查找。
相对文件路径
简单的路径可以通过将相对文件路径 查找,如:
python
with open('text_files/pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())在Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/):
绝对文件路径
如果文件不在当前项目目录下,需要提供绝对文件路径,如:
python
# 绝对文件路径, 一般存储在变量中
file_path = '/Users/ly/Documents/code/coolo/blog-new/books/python/text_files/pi_digits.txt'
with open(file_path) as file_object:
contents = file_object.read()
print(contents.rstrip())1.3 逐行读取
读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本;
例如,你可能要遍历一个包含天气数据的文件,并使用天气描述中包含字样sunny的行。在新闻报道中,你可能会查找包含标签headline的行,并按特定的格式设置它。
以每次一行的方式检查文件,可对文件对象使用for循环: 》file_reader.py
python
# 逐行读取文件1
with open(file_path) as file_object:
for line in file_object:
print(line.rstrip())
# 逐行读取文件2
with open(file_path) as file_object:
lines = file_object.readlines() # 各行存储在一个列表中
for line in lines:
print(line.strip())1.4 文件装换
读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转换为浮点数。
1.5 超大型文件
对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。
文件可以切片
python
# 读取文件的前5行
with open(file_path) as file_object:
lines = file_object.readlines() # 各行存储在一个列表中
for line in lines[:5]:
print(line.strip())2. 写入文件
2.1 写入空文件
要将文本写入文件,你需要在调用open()时指定写入模式('w')。如果要写入的文件不存在,Python将自动创建它。
下面的程序创建一个空文件programming.txt: 》programming.txt
python
with open('programming.txt', 'w') as file_object:
file_object.write("I love programming.")- 用open()时提供了两个实参:文件名('programming.txt')和模式('w');
- 打开文件时,可指定
读取模式('r')、写入模式('w')、附加模式('a')或让你能够读取和写入文件的模式('r+')。如果你省略了模式实参,Python将以默认的只读模式打开文件。 - 模式('w'), 如果你要写入的文件不存在,函数open()将自动创建它。
- 以写入('w')模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件
- Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
2.2 写入多行
要写入多行,需要在write()语句中包含换行符('\n'):
》programming.txt
python
with open('programming.txt', 'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")2.3 附加到文件
如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式('a')打开文件。你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。
例如,下面的程序在文件programming.txt末尾添加一行: 》programming.txt
python
with open('programming.txt', 'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")3. 存储数据
模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用。
3.1 json.dump() 存储
python
import json
# 存储数据
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as file_object:
json.dump(numbers, file_object)3.2 json.load() 加载
python
import json
# 加载数据
filename = 'numbers.json'
with open(filename) as file_object:
numbers = json.load(file_object)
print(numbers)4. 异常处理
使用文件时,一种常见的问题是找不到文件:你要查找的文件可能在其他地方、文件名可能不正确或者这个文件根本就不存在。对于所有这些情形,都可使用try-except代码块以直观的方式进行处理。
文件找不到,会报告了FileNotFoundError异常。
python
import json
# 加载数据
filename = 'numbers.json'
try:
with open(filename) as file_object:
numbers = json.load(file_object)# 如果这个文件存在,就将其中的用户名读取到内存中
except FileNotFoundError:# 处理文件不存在的异常
print(f"Sorry, the file {filename} does not exist.")
else:# 成功后执行
print(numbers)