参考文献:《Python数据分析基础》
前言
有时,在文件内容中,工作表头部和尾部都是你不想处理的。
例如,在supplier_data_unnecessary_header_footer.csv文件中,头部有“I don’t care about this row”,尾部有“I don’t want this row either”。这两部分都不是我们想要的,通过本文的讲述,我们将学习使用Python脚本使它不读取这些行。
创建脚本
在文本编辑器中输入一段代码,然后将文件保存为:11csv_reader_select_contiguous_rows.py
#!/usr/bin/env python3
import csv
import sys
input_file = sys.argv[1]
output_file = sys.argv[2]
row_counter = 0
with open(input_file, 'r', newline='') as csv_in_file:
with open(output_file, 'w', newline='') as csv_out_file:
filereader = csv.reader(csv_in_file)
filewriter = csv.writer(csv_out_file)
for row in filereader:
if row_counter >= 3 and row_counter <= 15:
filewriter.writerow([value.strip() for value in row])
row_counter += 1
脚本代码注释
row_counter = 0
这里使用row_counter变量来跟踪行编号,以便可以识别和选取想要保留的行。
if row_counter >= 3 and row_counter <= 15:
这一行代码使用if控制流语句,跳过那些不需要的头部和尾部。在本例输入文件的前三行和后三行均不执行if代码块,起到了不读取这些行的效果。
filewriter.writerow([value.strip() for value in row])
这行代码的作用是处理需要保留的行,将它们写入输出文件,在列表生成式中,使用strip函数除去列表中每个元素两端的空格、制表符和换行符。
在这里需要进一步讨论一下,由于小编比较懒,一开始把这行代码写成了这个样子:
filewriter.writerow(row)
运行这两种版本的脚本,观察一下各自csv格式的文件
(左图为无strip版,右图为有strip版)
是不是没有看出什么明显的不同呢?那这意味着两种版本就是相同的吗?
答案当然不是啦!我们不妨换一种文件打开方式看看,这里小编使用的是记事本。
再仔细观察,是不是发现了一些端倪呢?细心的小伙伴可以看出,这两种版本区别在于最后一个逗号前的空格。无strip版本有空格,而有strip版本无空格。到此,是不是就可以理解strip函数在此处的作用呢?
row_counter += 1
最后这一行代码,作用是将行编号进行迭代。
运行脚本
在命令行输入以下命令,然后按回车键:
查看结果
(左图为处理前,右图为处理后)
结语
本文介绍了CSV文件中选取连续行的知识,对书上的内容及实际操作出现的问题进行了思考与总结。