返回介绍

2.4 选取连续的行

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

有些时候,在文件内容中,工作表头部和尾部都是你不想处理的。例如,文件头部可能是标题和作者信息,文件尾部也可能会列出来源、假设、附加说明和注意事项。在很多情况下,你不需要处理这些内容。

为了演示如何在 CSV 文件中选取连续的行,需要对输入文件做如下修改。

(1) 在电子表格软件中打开 supplier_data.csv。

(2) 在文件头部插入 3 行,就在列标题那行的上面。

在 A1:A3 单元格中随便写一些文字,比如“I don't care about this line”。

(3) 在文件尾部,也就是最后一行数据下面插入 3 行。

在最后一行数据下面 A 列的 3 个单元格中随便写一些文字,比如“I don't want this line either”。

(4) 将文件保存为 supplier_data_unnecessary_header_footer.csv。这个文件应该如图 2-10 所示。

图 2-10:在你需要的行上方和下方具有无关数据的 CSV 文件

现在输入文件中包含了你不需要的头部和尾部信息,修改一下 Python 脚本,使它不读取这些行。

01. 基础Python

要使用基础 Python 选取特定行,这里使用 row_counter 变量来跟踪行编号,以便可以识别和选取想保留的行。从前面的示例中,你已经知道了要保留 13 行数据。在下面的 if 代码块中,你可以看到你要写入输出文件中的行就是行索引大于等于 3 并小于等于 15 的行。

要使用基础 Python 选取这些行,在文本编辑器中输入下列代码,然后将文件保存为 11csv_reader_select_contiguous_rows.py:

 1 #!/usr/bin/env python3
 2 import csv
 3 import sys
 4 input_file = sys.argv[1]
 5 output_file = sys.argv[2]
 6 row_counter = 0
 7 with open(input_file, 'r', newline='') as csv_in_file:
 8     with open(output_file, 'w', newline='') as csv_out_file:
 9          filereader = csv.reader(csv_in_file)
10          filewriter = csv.writer(csv_out_file)
11          for row in filereader:
12              if row_counter >= 3 and row_counter <= 15:
13                   filewriter.writerow([value.strip() for value in row])
14              row_counter += 1
15

这里使用 row_counter 变量和一个 if 语句来保留需要的行,跳过那些不需要的头部和尾部内容。对于输入文件的前 3 行,因为 row_counter 小于 3,所以不执行 if 代码块,并将 row_counter 的值增加 1。

对于输入文件的最后 3 行,row_counter 大于 15,所以也不执行 if 代码块,并将 row_counter 的值增加 1。

你要保留的行在无用的头部和尾部之间。对于这些行,row_counter 在 3 和 15 之间。if 代码块处理这些行并将它们写入输出文件。在列表生成式中使用 string 模块的 strip 函数除去每行两端的空格、制表符和换行符。

如果想看看 row_counter 变量的值和每行的内容,可以在现有的 writerow 语句上面加上一个 print 语句,比如 print(row_counter, [value.strip() for value in row])。

要运行这个脚本,在命令行中输入以下命令,然后按回车键:

python 11csv_reader_select_contiguous_rows.py supplier_data_unnecessary_header_\
footer.csv output_files\11output.csv

你可以打开输出文件 11output.csv 查看一下结果。

02. pandas

pandas 提供了 drop 函数根据行索引或列标题来丢弃行或列。在下面的脚本中,drop 函数从输入文件中丢弃前 3 行和最后 3 行(也就是行索引为 0,1,2 和 16,17,18 的那些行)。pandas 还提供了功能强大的 iloc 函数,你可以使用这个函数根据行索引选取一个单独行作为列索引。最后,使用 reindex 函数为数据框重新生成索引。

使用 pandas 可以保留列标题行和数据行,除去不需要的头部和尾部。在文本编辑器中输入下列代码,并将文件保存为 pandas_select_contiguous_rows.py:

#!/usr/bin/env python3
import pandas as pd
import sys
input_file = sys.argv[1]
output_file = sys.argv[2]
data_frame = pd.read_csv(input_file, header=None)
data_frame = data_frame.drop([0,1,2,16,17,18])
data_frame.columns = data_frame.iloc[0]
data_frame = data_frame.reindex(data_frame.index.drop(3))
data_frame.to_csv(output_file, index=False)

要运行这个脚本,在命令行中输入以下命令,然后按回车键:

python pandas_select_contiguous_rows.py supplier_data_unnecessary_header_\
footer.csv output_files\pandas_output.csv

你可以打开输出文件 pandas_output.csv 查看一下结果。

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

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

发布评论

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