使用 Python 从制表符分隔文件导入数据
介绍
制表符分隔文件是一种广为人知且广泛使用的文本数据交换格式。通过使用与电子表格类似的结构,它还允许用户以易于理解的方式呈现信息,并可在应用程序(包括关系数据库管理系统)之间共享。
IANA 制表符分隔值标准要求文件的第一行包含字段名称。此外,其他行(代表单独的记录)必须具有相同数量的列。
其他格式(例如逗号分隔值)通常面临着必须转义逗号的挑战,逗号在文本中很常见(与制表符相反)。
使用 Python 打开文件
在深入研究处理制表符分隔值之前,我们将回顾一下如何使用 Python 读取和写入文件。以下示例使用open()内置函数打开位于当前目录中名为players.txt 的文件:
with open('players.txt') as players_data:
players_data.read()
open ()函数接受一个可选参数,该参数指示文件的使用方式。如果不存在,则假定为只读模式。其他替代方案包括但不限于“w”(以截断模式打开以进行写入)和“a”(以追加模式打开以进行写入)。
按两次 Enter 键执行上述代码后,我们将看到字段之间的制表符 ( \t ) 和新行符 ( \n ) 作为记录分隔符,如图 1 所示:
尽管我们主要关注从文件中提取数据,但我们也可以写入数据。再次注意开头使用\n来表示新记录,使用\t来分隔字段:
with open('players.txt', 'a') as players_data:
players_data.write('\n{}\t{}\t{}\t{}\t{}\t{}\t{}'.format('Trey', 'Burke', '23', '1.85', '2013', '79.4', '23.2'))
尽管format()函数有助于提高可读性,但还有更有效的方法来处理读写 - 所有这些方法都在标准库的同一模块中可用。如果我们要处理大文件,这一点尤其重要。
介绍 CSV 模块
尽管CSV模块以逗号分隔值命名,但它可以管理解析的文件,而不管字段分隔符是什么 - 无论是制表符、竖线还是其他任何东西。此外,此模块提供了两个类来读取和写入数据到 Python 字典(分别是DictReader和DictWriter)。在本指南中,我们将专注于前者。
为了说明,我们将使用2018 年 11 月以来访客赢得比赛的 NBA 比赛列表,其中包含 2018 年 11 月以来访客赢得比赛的 NBA 比赛列表。
首先,我们将导入CSV模块:
import csv
接下来,我们将以只读模式打开文件,实例化一个 CSV 读取器对象,并使用它来一次读取一行:
with open('nba_games_november2018_visitor_wins.txt', newline = '') as games:
game_reader = csv.reader(games, delimiter='\t')
for game in game_reader:
print(game)
虽然在我们的例子中这不是必需的,但我们将根据模块文档将newline = ''作为参数传递给open()函数。如果我们的文件在引号字段内包含换行符,这可确保它们被正确处理。
图 2 显示执行上述程序后,每一行都被读入一个列表中:
尽管这无疑比我们以前的版本(制表符和新行与实际内容混合)看起来好得多,但仍有改进的空间。
DictReader 类
CSV DictReader 对象的行为本质上与常规读取器相同,但从 Python 3.6 开始将每行映射到有序字典。在以前的版本中,每行都映射到普通字典。无论如何,这使我们能够使用我们在前两个指南(在 Python 中操作列表和字典、使用 Python 从 Microsoft Excel 文件导入数据)中介绍的方法和工具来操作 Python 字典。
首先,我们将创建一个空列表,将每个游戏存储为单独的字典:
games_list = []
最后,我们将重复上述代码,但只进行微小改动。我们不会打印每一行,而是将其添加到games_list中。如果您使用的是 Python 3.5 或更早版本,则可以省略dict()并改用games_list.append(game)。在 Python 3.6 及更新版本中,此函数用于将有序字典转换为常规字典,以提高可读性和更易于操作。
with open('nba_games_november2018_visitor_wins.txt', newline = '') as games:
game_reader = csv.DictReader(games, delimiter='\t')
for game in game_reader:
games_list.append(dict(game))
我们可以更进一步,使用列表推导式仅返回访客得分大于 130 的游戏。以下语句创建一个名为visit_big_score_games的新列表,并使用games_list中条件为真的每个游戏填充该列表:
visitor_big_score_games = [game for game in games_list if int(game['Visitor score']) > 130]
现在我们有了一个字典列表,我们可以将其写入电子表格,如使用 Python 从 Microsoft Excel 文件中导入数据中所述,或者以其他方式对其进行操作。另一种选择是将转换为字符串的列表写入名为Visitor_big_score_games.json的纯文本文件,以便以 JSON 格式分发:
with open('visitor_big_score_games.json', 'w') as games:
games.write(str(visitor_big_score_games))
write ()函数需要字符串作为参数。这就是为什么我们必须在执行写入操作之前将整个列表转换为字符串。
如果您只是想查看列表,而不是将其转换为电子表格或 JSON 文件,您也可以使用pprint()以用户友好的格式显示它,如图 3 所示:
import pprint as pp
pp.pprint(visitor_big_score_games)
正如您所见,可能性是无穷无尽的,唯一的限制就是我们的想象力!
概括
在本指南中,我们学习了如何使用 Python 导入和操作制表符分隔文件中的数据。这不仅对数据科学家来说是一项非常有价值的技能,对 Web 开发人员和其他 IT 专业人员来说也是如此。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~