Skip to content

文件

从这里开始已经超越基本技能了。

在本章中,将学习处理文件,让程序能够快速地分析大量的数据

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)

京ICP备2024093538号-1