2.4 选取连续的行
有些时候,在文件内容中,工作表头部和尾部都是你不想处理的。例如,文件头部可能是标题和作者信息,文件尾部也可能会列出来源、假设、附加说明和注意事项。在很多情况下,你不需要处理这些内容。
为了演示如何在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论