返回介绍

1.5 读取文本文件

发布于 2024-01-27 22:10:03 字数 3962 浏览 0 评论 0 收藏 0

数据几乎无一例外地是被保存在文件中的。这些文件可能是文本文件、CSV 文件、Excel 文件或其他类型的文件。知道如何访问此类文件以及从中读取数据是在 Python 中进行数据处理、加工与分析的前提。当完成了一个每秒钟可以处理很多文件的程序时,与手动一个个地处理文件相比,你会真正体会到写程序的好处。

你需要告诉 Python,脚本要处理何种类型的文件。你可以在程序中写死文件名称,但是如果这样的话,就不能使用这个程序处理多个不同的文件了。能读取多个不同文件的方法是,在命令行窗口或终端窗口的命令行中,在 Python 脚本的名字后面加上完整的文件路径名。要使用这种方法,需要在脚本开始时导入内置的 sys 模块。在脚本上方加上 import sys 语句之后,就可以在脚本中使用 sys 模块提供的所有功能了:

#!/usr/bin/env python3
from math import exp, log, sqrt
import re
from datetime import date, time, datetime, timedelta
from operator import itemgetter
import sys

导入了 sys 模块之后,你就可以使用 argv 这个列表变量了。这个变量捕获了传递给 Python 脚本的命令行参数列表,即你在命令行中的所有输入,包括你的脚本名称。和任何其他列表一样,argv 也有索引。argv[0] 就是脚本名称,argv[1] 是命令行中传递给脚本的第一个附加参数,在这个例子中,就是 first_script.py 将要读取的文件路径名。

1.5.1 创建文本文件

要读取一个文本文件,首先要创建它。要创建文本文件,需执行以下步骤。

(1) 打开 Spyder IDE 或一个文本编辑器(例如:Windows 系统下的 Notepad、Notepad++、Sublime Text;macOS 系统下的 TextMate、TextWrangler、Sublime Text)。

(2) 在文本文件中写入下面 6 行(参见图 1-10):

I'm
already
much
better
at
Python.

图 1-10:Notepad++ 中的文本文件 file_to_read.txt(Windows)

(3) 将文件保存在桌面上,文件名为 file_to_read.txt。

(4) 将下面几行代码添加到 first_script.py 的下方:

# 读取文件
# 读取单个文本文件
input_file = sys.argv[1]

print "Output #143: "
filereader = open(input_file, 'r')
for row in filereader:
    print row.strip()
filereader.close()

示例中的第一行代码使用 sys.argv 列表捕获了要读取的文件的路径名,并将路径名赋给变量 input_file。第二行代码创建了一个文件对象 filereader,其中包含了以 r 模式(只读模式)打开的 input_file 文件中的各个行。下一行中的 for 循环每次读取 filereader 对象中的一行。for 循环内部的 print 语句打印出每一行,并且在打印之前用 strip 函数去掉每一行两端的空格、制表符和换行符。最后一行代码在输入文件中的所有行都被读取并打印到屏幕后,关闭 filereader 对象。

(5) 重新保存 first_script.py。

(6) 要读取刚才创建的文本文件,输入下面的命令,如图 1-11 所示,然后按回车键:

python first_script.py file_to_read.txt

图 1-11:Python 脚本和它要在命令行窗口中处理的文本文件

这样,你就在 Python 中读取了一个文本文件。你会看到下面的内容被打印到屏幕上,在以前的输出之后(图 1-12):

I'm
already
much
better
at
Python.

图 1-12:first_script.py 的输出,在命令行窗口中处理文本文件

1.5.2 脚本和输入文件在同一位置

因为 first_script.py 和 file_to_read.txt 在同一位置,即都在桌面上,所以简单地输入 python first_script.py file_to_read.txt 是可以的。如果文本文件和脚本不在同一位置,就需要输入文本文件的完整路径名,这样脚本才能知道去哪里寻找这个文件。

例如,如果文本文件在你的 Documents 文件夹中,而不是在桌面上,那么你可以在命令行中使用下面的路径名来从其所处位置读取文本文件:

python first_script.py "C:\Users\[Your Name]\Documents\file_to_read.txt"

1.5.3 读取文件的新型语法

前面讲的用来创建 filereader 对象的那行代码是创建文件对象的传统方法。这种方法没有什么问题,但是它使文件对象一直处于打开状态,直到使用 close 函数明确地关闭或直到脚本结束。尽管这种做法一般没有问题,但不够清晰,还被证明在更复杂的脚本中会导致错误。从 Python 2.5 开始,你可以使用 with 语句来创建文件对象。这种语法在 with 语句结束时会自动关闭文件:

input_file = sys.argv[1]
print("Output #144:")
with open(input_file, 'r', newline='') as filereader:
for row in filereader:
    print("{}".format(row.strip()))

你可以看到,使用 with 语句的版本与前一个版本非常相似,但是它不需调用 close 函数来关闭 filereader 对象。

这个示例演示了如何使用 sys.argv 来访问并打印一个文本文件中的内容。这是一个简单的示例,但在后面的示例中,要以此为基础访问其他类型的文件,或一次访问多个文件,并向输出文件中写入内容。

下一节介绍 glob 模块,它让你能够通过几行代码读取和处理多个输入文件。glob 模块之所以功能强大,是因为它处理的是文件夹(也就是说,它处理目录,不是单个的文件),所以将前面读取文件的代码删除或注释掉,这样就可以使 argv[1] 指向一个文件夹,而不是一个文件了。将代码注释掉就是在你希望计算机忽略掉的代码前面加上一个井号,所以当你结束注释时,first_script.py 文件就应该像下面这样:

## 读取一个文本文件(旧方法) ##
#input_file = sys.argv[1]
#print("Output #143:")
#filereader = open(input_file, 'r', newline='')
#for row in filereader:
# print("{}".format(row.strip()))
#filereader.close()
## 读取一个文本文件(新方法) ##
#input_file = sys.argv[1]
#print("Output #144:")
#with open(input_file, 'r', newline='') as filereader:
# for row in filereader:
# print("{}".format(row.strip()))

做完这些修改之后,你就可以添加下一节要讨论的 glob 代码来处理多个文件了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文