-
2021-03-18 11:41:14
筛选特定的行
有些时候,你并不需要文件中所有的数据。例如,你可能只需要一个包含特定词或数字的行的子集,或者是与某个具体日期关联的行的子集。在这些情况下,可以用 Python 筛选出特定的行来使用。
你应该很熟悉如何在 Excel 中手动筛选行,使你既能处理因为体积太大以致 Excel 不能打开的 CSV 文件,又能处理多个 CSV 文件。因为要通过手动处理这些文件,时间花费太多了。
下面演示了在输入文件中筛选出特定行的 3 种方法:
行中的值满足某个条件
行中的值属于某个集合
行中的值匹配于某个模式(正则表达式)
接下来会详细解释这种通用结构,使你可以轻松地修改代码来满足自己的业务规则。
请注意以下结构,从而来理解如何从输入文件中筛选出特定的行:
for row in filereader:
***if value in row meets some business rule or set of rules:***
do something
else:
do something else
这段伪代码展示了用来在输入文件中筛选出特定行的通用代码结构。在下面,会修改封装在 *** 之间的代码,以使脚本能够满足具体业务规则,抽取出你需要的数据。
行中的值满足某个条件
基础Python
有些时候,当行中的值满足一个具体条件时,才需要保留这些行。例如,你可能会希望在数据集中保留那些成本高于某个具体阈值的行,或者希望保留所有购买日期在一个具体日期之前的行。在这种情况下,你可以检验行中的值是否满足具体的条件,然后筛选出满足条件的行。
下面的示例演示了检验行值是否满足两个具体条件的方法,并将满足条件的行的子集写入一个输出文件。在这个示例中,保留供应商名字为 Supplier Z 或成本大于 $600.00 的行,并将结果写入输出文件。要筛选出满足这些条件的行的子集,在文本编辑器中输入以下代码,将文件保存为 3csv_reader_value_meets_condition.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 with open(input_file, 'r', newline='') as csv_in_file:
7 with open(output_file, 'w', newline='') as csv_out_file:
8 filereader = csv.reader(csv_in_file)
9 filewriter = csv.writer(csv_out_file)
10 header = next(filereader)
11 filewriter.writerow(header)
12 for row_list in filereader:
13 supplier = str(row_list[0]).strip()
14 cost = str(row_list[3]).strip('$').replace(',', '')
15 if supplier == 'Supplier Z' or float(cost) > 600.0:
16 filewriter.writerow(row_list)
第 10 行代码使用 csv 模块的 next 函数读出输入文件的第一行,赋给名为 header 的列表变量。第 11 行代码将标题行写入输出文件。
第 13 行代码取出每行数据中的供应商名字,并赋给名为 supplier 的变量。这行代码使用列表索引取出每行数据的第一个值 row[0],然后使用 str 函数将其转换为一个字符串。在此之后,使用 strip 函数删除字符串两端的空格、制表符和换行符。最后,将处理好的字符串赋给变量 supplier。
第 14 行代码取出每行数据中的成本,并赋给名为 cost 的变量。这行代码使用列表索引取出每行数据的第四个值 row[3],然后使用 str 函数将其转换为一个字符串。在此之后,使用 strip 函数从字符串中删除美元符号。接着使用 replace 函数从字符串中删除逗号。最后,将处理好的字符串赋给变量 cost。
第 15 行代码创建了一个 if 语句,来检验每行中的这两个值是否满足条件。具体来说,这里想筛选出供应商名字为 Supplier Z 或者成本大于 $600.00 的那些行。if 和 or 之间的第一个条件检验变量 supplier 中的值是否为 Supplier Z。or 和冒号之间的第二个条件检验变量 cost 中的值在被转换为浮点数之后,是否大于 600.0。
第 16 行代码使用 filewriter 的 writerow 函数将满足条件的行写入输出文件。
要运行这个脚本,输入以下命令,然后按回车键:
python 3csv_reader_value_meets_condition.py supplier_data.csv\
output_files\3output.csv
在屏幕上你不会看到任何输出,但可以打开输出文件 3output.csv 看一下结果。检查一下,确保结果正确,然后可以修改一下代码,设定不同的供应商或成本阈值,试着筛选一下其他数据。
pandas
pandas 提供了一个 loc 函数,可以同时选择特定的行与列。你需要在逗号前面设定行筛选条件,在逗号后面设定列筛选条件。下面的 loc 函数中的条件设置为:Supplier Name 列中姓名包含 Z,或者 Cost 列中的值大于 600.0,并且需要所有的列。在文本编辑器中输入以下代码,将文件保存为 pandas_value_meets_condition.py(这个脚本使用 pandas 来分析 CSV 文件,并将满足条件的行写入输出文件)。
#!/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)
data_frame['Cost'] = data_frame['Cost'].str.strip('$').astype(float)
data_frame_value_meets_condition = data_frame.loc[(data_frame['Supplier Name']\
.str.contains('Z')) | (data_frame['Cost'] > 600.0), :]
data_frame_value_meets_condition.to_csv(output_file, index=False)
在命令行中运行脚本,并给出数据源文件和输出文件。
python pandas_value_meets_condition.py supplier_data.csv\
output_files\pandas_output.csv
在屏幕上你不会看到任何输出,但可以打开输出文件 pandas_output.csv 看一下结果。试试修改一下 loc 函数中的参数,选择出另外一些数据。
行中的值属于某个集合
基础Python
有些时候,当行中的值属于某个集合时,才需要保留这些行。例如,你可能会希望在数据集中保留那些供应商名字属于集合 {Supplier X, Supplier Y} 的行(这里的花括号表示集合,不是 Python 中的字典),或者希望保留所有购买日期属于集合 {‘1/20/14’, ‘1/30/14’} 的行。在这种情况下,你可以检验行中的值是否属于某个集合,然后筛选出具有属于该集合的值的行。
下面的示例演示了检验行值是否是集合成员的方法,并将具有集合中的值的行写入到输出文件。在这个示例中,是要保留那些购买日期属于集合 {‘1/20/14’, ‘1/30/14’} 的行,并将结果写入输出文件。要筛选出值属于这个集合的行的子集,在文本编辑器中输入以下代码,并将文件保存为 4csv_reader_value_in_set.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 important_dates = ['1/20/14', '1/30/14']
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 header = next(filereader)
12 filewriter.writerow(header)
13 for row_list in filereader:
14 a_date = row_list[4]
15 if a_date in important_dates:
16 filewriter.writerow(row_list)
第 6 行代码创建了一个名为 important_dates 的列表变量,其中包含两个特定日期,这个变量就是你的集合。创建包含特定值的变量,然后在代码中引用变量,这种编写代码的方式非常有用。使用了这种方式,如果变量值发生了变化,你只需在一个地方修改代码(就是定义变量的地方),变量值的变化就会反映到代码中所有引用该变量的地方。
第 14 行代码取出每一行的购买日期,并将其赋给变量 a_date。从行列表的索引值 row[4] 可知,购买日期在第 5 列。
第 15 行代码创建了一个 if 语句来检验 a_date 变量中的购买日期是否属于 important_dates 这个集合。如果变量值在集合中,下一行代码就将这一行写入输出文件。
在命令行中运行下面脚本:
python 4csv_reader_value_in_set.py supplier_data.csv output_files/4output.csv
你可以打开输出文件 4output.csv 来检查结果。
pandas
当行中的值属于某个集合时,如何使用 pandas 筛选出这些行呢?在文本编辑器中输入以下代码,然后将文件保存为 pandas_value_in_set.py(这个脚本分析 CSV 文件,并将值属于某个集合的行写入输出文件):
#!/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)
important_dates = ['1/20/14', '1/30/14']
data_frame_value_in_set = data_frame.loc[data_frame['Purchase Date'].\
isin(important_dates), :]
data_frame_value_in_set.to_csv(output_file, index=False)
这里最重要的新命令就是简洁的 isin。
和以前一样,在命令行中运行脚本,并给出源数据文件名和输出文件名:
python pandas_value_in_set.py supplier_data.csv output_files\pandas_output.csv
你可以打开输出文件 pandas_output.csv 来检查结果。
行中的值匹配于某个模式/正则表达式
基础Python
有些时候,当行中的值匹配了或包含了一个特定模式(也就是正则表达式)时,才需要保留这些行。例如,你可能会希望在数据集中保留所有发票编号开始于“001-”的行,或者希望保留所有供应商名字中包含“Y”的行。在这种情况下,你可以检验行中的值是否匹配或包含某种模式,然后筛选出匹配了或包含了该模式的行。
下面的示例演示了如何检验某个值是否匹配特定的模式,并将具有这种值的行写入输出文件。在这个示例中,保留发票编号由“001-”开头的行,并将结果写入一个输出文件。要筛选出某个值匹配了这个模式的行,在文本编辑器中输入下列代码,然后将文件保存为 5csv_reader_value_matches_pattern.py:
1 #!/usr/bin/env python3
2 import csv
3 import re
4 import sys
5 input_file = sys.argv[1]
6 output_file = sys.argv[2]
7 pattern = re.compile(r'(?P^001-.*)', re.I)
8 with open(input_file, 'r', newline='') as csv_in_file:
9 with open(output_file, 'w', newline='') as csv_out_file:
10 filereader = csv.reader(csv_in_file)
11 filewriter = csv.writer(csv_out_file)
12 header = next(filereader)
13 filewriter.writerow(header)
14 for row_list in filereader:
15 invoice_number = row_list[1]
16 if pattern.search(invoice_number):
17 filewriter.writerow(row_list)
第 3 行代码导入正则表达式(re)模块,这样就可以使用 re 模块中的函数了。
第 7 行代码使用 re 模块的 compile 函数创建一个名为 pattern 的正则表达式变量。r 表示将单引号之间的模式当作原始字符串来处理。
元字符 ?P 捕获了名为 的组中匹配了的子字符串,以便在需要时将它们打印到屏幕或写入文件。
这里要搜索的实际模式是001-.*。插入符号()是一个特殊符号,表示只在字符串开头搜索模式。所以,字符串需要以“001-”开头。句点 . 可以匹配任何字符,除了换行符。所以除换行符之外的任何字符都可以跟在“001-”后面。最后,* 表示重复前面的字符 0 次或更多次。.* 组合在一起用来表示除换行符之外的任意字符可以在“001-”后面出现任意次。更通俗的说法是:字符串在“-”后面可以包含任意值,只要字符串开始于“001-”,就会匹配正则表达式。
最后,参数 re.I 告诉正则表达式进行大小写敏感的匹配。此参数在这个示例中不是太重要,因为模式是数值型的,但是它说明了在模式中包含字符并且需要进行大小写敏感的匹配时,应该如何设置参数。
第 15 行代码使用列表索引从行中取出发票编号,并赋给变量 invoice_number。在下一行中,将在这个变量中寻找模式。
第 16 行代码使用 re 模块的 search 函数在 invoice_number 的值中寻找模式。如果模式出现在 invoice_number 值中,第 17 行代码就将这行写入输出文件。
要运行这个脚本,在命令行中输入以下命令,然后按回车键:
python 5csv_reader_value_matches_pattern.py supplier_data.csv\
output_files\5output.csv
你可以打开输出文件 5output.csv 来查看结果。
pandas
要使用 pandas 筛选出匹配于某个模式的行,在文本编辑器中输入下列代码,然后将文件保存为 pandas_value_matches_pattern.py(这个脚本读取 CSV 文件,将匹配于某个模式的行打印在屏幕上,并将同样的行写入输出文件):
#!/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)
data_frame_value_matches_pattern = data_frame.loc[data_frame['Invoice Number'].\
str.startswith("001-"), :]
data_frame_value_matches_pattern.to_csv(output_file, index=False)
使用 pandas 时,可以使用 startwith 函数来搜索数据,不用再使用笨重冗长的正则表达式了。要运行这个脚本,在命令行中输入以下命令,然后按回车键:
python pandas_value_matches_pattern.py supplier_data.csv\
output_files\pandas_output.csv
你可以打开输出文件 pandas_output.csv 查看一下结果。
选取特定的列
有些时候,你并不需要文件中所有的列。可以使用 Python 选取出你需要的列。
有两种通用方法可以在 CSV 文件中选取特定的列。下面演示了这两种方法:
使用列索引值
使用列标题
列索引值
基础Python
在 CSV 文件中选取特定列的一种方法是使用你想保留的列的索引值。当你想保留的列的索引值非常容易识别,或者在处理多个输入文件时,各个输入文件中列的位置一致(也就是不会发生改变)的时候,这种方法非常有效。例如,如果你只需要保留数据的第一列和最后一列,那么你可以使用 row[0] 和 row[-1] 来将每行的第一个值和最后一个值写入文件。
在这个示例中,你只想保留供应商姓名和成本这两列。要使用索引值选取这两列,在文本编辑器中输入下列代码,然后将文件保存为 6csv_reader_column_by_index.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 my_columns = [0, 3]
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_list in filereader:
12 row_list_output = [ ]
13 for index_value in my_columns:
14 row_list_output.append(row_list[index_value])
15 filewriter.writerow(row_list_output)
第 6 行代码创建了一个列表变量 my_columns,其中包含了你想保留的两列的索引值。在这个示例中,这两个索引值对应着供应商姓名和成本列。再说一次,应该创建一个包含索引值的变量,然后在代码中引用这个变量。这样,如果索引值需要改变的话,你只需要在一个地方(就是定义 my_columns 的地方)修改即可,修改会反映到代码中所有引用 my_columns 的地方。
第 12~15 行代码是 for 循环下面缩进的部分,所以对于输入文件中的每一行都要执行这些代码。第 12 行代码创建了一个空列表变量 row_list_output。这个变量保存你在每行中要保留的值。第 13 行代码是一个 for 循环语句,在 my_cloumns 中的各个索引值之间进行迭代。第 14 行代码通过列表的 append 函数使用每行中 my_columns 索引位置的值为 row_list_output 填充元素。这 3 行代码生成了一个列表,列表中包含了每行中你要写入输出文件的值。创建列表是有用的,因为 filewriter 的 writerow 方法需要一个字符串序列或数值序列,而列表 row_list_out 正是一个字符串序列。第 15 行代码将 row_list_output 中的值写入输出文件。
脚本会对输入文件中的每一行执行这些代码。为了确切地理解这一系列操作,下面来看看第一次外部 for 循环做了些什么。在本例中,你处理的是输入文件中的第一行(也就是标题行)。第 12 行代码创建了空列表变量 row_list_output。第 13 行代码是一个 for 循环,在 my_columns 的值之间迭代。
第一次循环时,index_value 等于 0,所以第 14 行代码中的 append 函数将 row[0](就是供应商姓名字符串)加入 row_list_output。此后,代码回到第 13 行中的 for 循环,这一次 index_value 等于 3。因为 index_value 等于 3,所以第 14 行代码中的 append 函数将 row[3](也就是成本字符串)加入 row_list_output。my_columns 中没有更多的值了,所以第 13 行中的 for 循环结束,代码前进到第 15 行。第 15 行代码将 row_list_output 中的列表值写入输出文件。然后,代码回到第 11 行中的外部 for 循环,开始处理输入文件中的下一行。
要运行这个脚本,在命令行中输入以下命令,然后按回车键:
python 6csv_reader_column_by_index.py supplier_data.csv output_files\6output.csv
你可以打开输出文件 6output.csv 查看一下结果。
pandas
要使用 pandas 根据索引值选取列,在文本编辑器中输入下列代码,然后将文件保存为 pandas_column_by_index.py(这个脚本读取 CSV 文件,将索引值为 0 和 3 的列打印到屏幕,并将同样的行写入输出文件):
#!/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)
data_frame_column_by_index = data_frame.iloc[:, [0, 3]]
data_frame_column_by_index.to_csv(output_file, index=False)
这里使用了 iloc 函数来根据索引位置选取列。
在命令行中运行以下脚本:
python pandas_column_by_index.py supplier_data.csv\
output_files\pandas_output.csv
你可以打开输出文件 pandas_output.csv 查看一下结果。
列标题
基础Python
在 CSV 文件中选取特定列的第二种方法是使用列标题,而不是索引位置。当你想保留的列的标题非常容易识别,或者在处理多个输入文件时,各个输入文件中列的位置会发生改变,但标题不变的时候,这种方法非常有效。
举例来说,假设你只需要保留发票号码列和购买日期列。要使用列标题选取这两列,在文本编辑器中输入下列代码,然后将文件保存为 7csv_reader_column_by_name.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 my_columns = ['Invoice Number', 'Purchase Date']
7 my_columns_index = []
8 with open(input_file, 'r', newline='') as csv_in_file:
9 with open(output_file, 'w', newline='') as csv_out_file:
10 filereader = csv.reader(csv_in_file)
11 filewriter = csv.writer(csv_out_file)
12 header = next(filereader, None)
13 for index_value in range(len(header)):
14 if header[index_value] in my_columns:
15 my_columns_index.append(index_value)
16 filewriter.writerow(my_columns)
17 for row_list in filereader:
18 row_list_output = [ ]
19 for index_value in my_columns_index:
20 row_list_output.append(row_list[index_value])
21 filewriter.writerow(row_list_output)
这个示例中的代码比上一个示例要稍微长一点,但是所有代码看起来都很熟悉。此示例中有更多代码的唯一原因就是,你需要先单独处理一下标题行,识别出相应标题行对应的索引值。然后你可以使用索引值保留每行中的值,这些值和要保留的列标题具有同样的索引值。
第 6 行代码创建了一个列表变量 my_columns,其中包含了两个字符串,即要保留的两列的名字。第 7 行代码创建了一个空列表变量 my_columns_index,要使用两个保留列的索引值来填充它。
第 12 行代码在 filereader 对象上使用 next 函数从输入文件中读出第一行,并保存在列表变量 header 中。第 13 行代码初始化在列标题的索引值中迭代的 for 循环。
第 14 行代码使用 if 语句和列表索引来检验每个列标题是否在 my_columns 中。例如,第一次 for 循环时,index_value 等于 0,所以 if 语句检验 header[0](也就是第一个列标题供应商姓名)是否在 my_columns 中。因为供应商姓名不在 my_columns 中,所以第 15 行代码不会对这个值执行。
代码返回第 13 行中的 for 循环,这一次 index_value 等于 1。然后,第 14 行代码中的 if 语句检验 header[1](也就是第二个列标题发票号码)是否在 my_columns 中。因为发票号码在 my_columns 中,所以执行第 15 行代码,将这列的索引值加入到 my_columns_index 列表中。
然后继续 for 循环,最后将购买日期列的索引值加入 my_columns_index。一旦 for 循环结束,第 16 行代码就将 my_columns 中的两个字符串写入输出文件。
第 18~21 行代码处理输入文件中余下的数据行。第 18 行代码创建一个空列表 row_list_output 来保存你要在每一行中保留的值。第 19 行代码中的 for 循环在 my_columns_index 中的索引值之间迭代,第 20 行代码将数据行中具有这些索引值的值加入 row_list_output。最后,第 21 行代码将 row_list_output 中的值写入输出文件。
在命令行中运行以下脚本:
python 7csv_reader_column_by_name.py supplier_data.csv output_files\7output.csv
你可以打开输出文件 7output.csv 查看一下结果。
pandas
要使用 pandas 根据列标题选取列,在文本编辑器中输入下列代码,然后将文件保存为 pandas_column_by_name.py(这个脚本读取 CSV 文件,将发票号码列与购买日期列打印到屏幕,并将同样的列写入输出文件):
#!/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)
data_frame_column_by_name = data_frame.loc[:, ['Invoice Number', 'Purchase Date']]
data_frame_column_by_name.to_csv(output_file, index=False)
这里又一次使用 loc 函数来选取列,这次使用的是列标题。
运行以下脚本:
python pandas_column_by_name.py supplier_data.csv output_files\pandas_output.csv
你可以打开输出文件 pandas_output.csv 查看一下结果。
选取连续的行
有些时候,在文件内容中,工作表头部和尾部都是你不想处理的。例如,文件头部可能是标题和作者信息,文件尾部也可能会列出来源、假设、附加说明和注意事项。在很多情况下,你不需要处理这些内容。
为了演示如何在 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 脚本,使它不读取这些行。
基础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
这里使用 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 查看一下结果。
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 查看一下结果。
更多相关内容 -
python处理csv数据的方法
2020-09-22 08:39:49主要介绍了python处理csv数据的方法,实例分析了Python处理csv数据的技巧,需要的朋友可以参考下 -
python处理csv数据动态显示曲线实例代码
2021-01-21 17:33:41本文研究的主要是python处理csv数据动态显示曲线,分享了实现代码,具体如下。 代码: # -*- coding: utf-8 -*- Spyder Editor This temporary script file is located here: C:\Users\user\.spyder2\.temp.py ... -
python从CSV导入数据源文件
2020-11-05 15:39:00CSV是指逗号分隔的值,文件中还包括一个文件头,也是以逗号分隔的。python从CSV导入数据源文件 -
python-csv文件数据处理
2022-05-29 20:11:02python-csv文件数据处理
概要
使用csv文件可以较容易地存储多行且列相同的数据,便于数据的读取与解析,也常用于自动化测试过程中的数据参数化。本文简单示例一种使用python处理csv文件的思路。
提示:以下为本篇文章正文内容,案例仅供参考。
一、所需插件
csv
。python自带库,无需额外安装。二、使用步骤
1.引入库
import csv
2.读取数据
# 读取完整csv文件内容,包括首行 def read_csv(self, filepath=None): if filepath is None: filepath = self.filepath with open(filepath, 'r', encoding = 'utf-8') as file: # 1、创建阅读器对象 reader = csv.reader(file) # 2、读取文件数据 rows = [row for row in reader] return rows
3.写入数据
# 读取完整csv文件内容,包括首行 # 按行写入数据到csv文件 # way写入方式,w-覆盖写入 at-追加写入 def write_csv(self, filepath, way, row): if filepath is None: filepath = self.filepath with open(filepath, way, encoding = 'utf-8', newline = '') as file: writer = csv.writer(file) writer.writerow(row)
4.应用示例
import csv import os class neo_csv: def __init__(self): self.filepath = os.getcwd() + "\\neo_data.csv" # 读取csv首行 def get_headrow(self, filepath=None): if filepath is None: filepath = self.filepath with open(filepath, 'r', encoding = 'utf-8') as file: reader = csv.reader(file) row = next(reader) return row # 转换首行列名为字典key def headrow_to_dict(self, filepath=None): head_row = self.get_headrow(filepath) head_col = {} for index, col_name in enumerate(head_row): head_col[col_name] = index return head_col # 读取完整csv文件内容,包括首行 def read_csv(self, filepath=None): if filepath is None: filepath = self.filepath with open(filepath, 'r', encoding = 'utf-8') as file: # 1、创建阅读器对象 reader = csv.reader(file) # 2、读取文件数据 rows = [row for row in reader] return rows # 按行写入数据到csv文件 # way写入方式,w-覆盖写入 at-追加写入 def write_csv(self, filepath, way, row): if filepath is None: filepath = self.filepath with open(filepath, way, encoding = 'utf-8', newline = '') as file: writer = csv.writer(file) writer.writerow(row) if __name__ == "__main__": my_test = neo_csv() # 创建csv文件:接口描述-参数化-参数校验 head_row = ['switch', 'method', 'url', 'need_token', 'urldata', 'jsondata', 'filedata', 'pars_genwith_sql', 'pars_genwith_upfile', 'pars_ck_required','pars_ck_boundary', 'pars_ck_legal', 'pars_ck_illegal'] filepath = os.getcwd() + '\\gendata.csv' my_test.write_csv(filepath, 'w', head_row) result = my_test.get_headrow(filepath) print("表头为", result) # 添加一行示例数据 data_row = ['true', 'post', '/user/login', 'false', '', {'username':'${username}','passwd':'${passwd}'},'','','',['username','passwd'],{'username':'8-15'},{'username':r'/w'},{'username':r'/s'}] my_test.write_csv(filepath, 'at', data_row) # 将列名称转换为字典的key head_col = my_test.headrow_to_dict(filepath) print("表头字典为", head_col) # 读取csv文件全部内容 csv_content = my_test.read_csv(filepath) print("完整内容为", csv_content) # 读取行的某列内容 for index in range (1, len(csv_content)): row = csv_content[index] print("该行内容为", row) # 根据列字典的key获取数组序号,再取该行该列的值 switch = row[head_col['switch']] method = row[head_col['method']] url = row[head_col['url']] print(switch, method, url)
后记
示例代码的执行结果如图。对于csv文件中数据的处理,还是需要结合实际需求去设计代码实现。
-
Python使用Pandas对csv文件进行数据处理的方法
2020-09-18 22:35:45主要介绍了Python使用Pandas对csv文件进行数据处理的方法,本文通过实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 -
python处理csv中的空值方法
2020-12-25 15:02:09如下所示: # -*- coding: UTF-8 -*- import jieba.posseg ...flags.DEFINE_string("train_file_address","D:/NLPWORD/cut_word_test/hzytest.csv","添加训练数据文件") flags.DEFINE_string("resu -
使用python处理csv数据的常规做法
2019-03-06 16:02:35在程序开始的地方,导入所有需要的包,这里是专门用来处理csv文件的包。如果是excel表格,可以把它的后缀改为.csv,后面处理方法则相同。 import csv #read file, for example file_path = 'C:/Users/Mytest/test...1. 导入数据
2. 处理数据
3. 分析数据
1. 导入数据
在程序开始的地方,导入所有需要的包,这里是专门用来处理csv文件的包。如果是excel表格,可以把它的后缀改为.csv,后面处理方法则相同。
import csv #read file, for example file_path = 'C:/Users/Mytest/test.csv' file = open(file_path) data = [] for i in file.readlines(): data.append(i) file.close()
上面的file.readlines()就是把csv文件中的每一行都读出来。如果是file.readline(),则只会读首行出来。
另外,最后记得file.close(),养成良好的习惯。当然,也可以用with * open as*的方法。
2. 处理数据
现在我们把csv的数据一行行地读到了data这个列表里了。csv里数据有多少行,data的length就是多么大。
然后,先来清洗一下数据。
现在data[0]是一个尾端带'\n'的字符串。我们想把data的每一行都处理成像表格里一样,可以在上面读数据的程序中加入这么几行。
如下
new_data = [] for row in data: tmp = row.strip('\n') #去掉每行最后的回车符 tmp = tmp.split(',') #根据','来分割字符串,使之成为含有一个个数据的列表 new_data.append(tmp) #new_data的每一行数据就是一个列表
3. 分析数据
我们 拿到new_data后,可以初步分析数据了。比如,可以看它的长度,每一行的数据个数等等。还可以进一步清洗数据。
len_data = len(new_data) #new_data的长度,即原csv表格里的行数 len_element = len(len_data[0]) #new_data第一行数据的长度,即原csv表格里的列数
如果csv的第3列是数字类型的数据,我们想把new_data中对应的数据转换类型,可以如下操作:
for i in new_data: tmp = i[2] #csv第三列为每行list中的第3个数据,下标为2 new_tmp = int(tmp) #如果此列数据包含小数的,应用new_tmp = float(tmp) i[2] = new_tmp
如果我们想把第3列中数值大于100的那一行数据提出来,可以再做如下操作:
select_data = [] for i in new_data: if i[2]>100: select_data.append(i) #这是复制了符合条件的整个行的数据到新的list里
后记:
为了更方便地处理数据,我们可以把select_data转换成numpy array格式。
import numpy as np select_data1 = np.array(select_data) select_data1.shape #select_data1.shape会得到一个元祖,如(100, 20),其中100为行数,20为列数
更多学习资料,请关注下面的公众号:不定期分享
- 深度学习网络总结
- 机器学习算法及其应用场景
- 算法与数据结构(leetcode 题解)
- cuda编程与并行优化
- 其他读书分享如:《战国策》,《智囊全集》
- 宇宙常识科普与星座辨别
- 等等
-
使用Python(pandas库)处理csv数据
2020-12-22 02:10:10(注:本文写于做毕设期间,有处理大量csv文件的需要,故使用python强大的库资源来处理数据,希望对有需要的你提供帮助和启发) 使用Python(pandas)处理数据 原始数据和处理之后的样式 图中为一个csv文件,待处理的... -
十分钟学会如何用Python处理CSV文件
2021-08-16 13:46:57十分钟学会如何用Python处理CSV文件 在前几年,如果你和嵌入式开发人员推荐Python,大概会是这样一种场景: A:”诶,老王,你看Python开发这么方便,以后会不会用到嵌入式设备?“ B:“别做梦了,那玩意儿速度贼慢...在前几年,如果你和嵌入式开发人员推荐Python,大概会是这样一种场景:
A:”诶,老王,你看Python开发这么方便,以后会不会用到嵌入式设备?“
B:“别做梦了,那玩意儿速度贼慢,肯定满足不了性能要求…”
但近几年,随着半导体行业的迅猛发展,嵌入式处理器的性能有了很大幅度的提高。与此同时,Python语言本身也在不断优化。因此,在嵌入式领域引入Python已经成为了必然趋势。
今天,作者就来总结一下使用Python处理物联网行业中一种常见的文件格式:csv文件。
Python库:csv
Python中集成了专用于处理csv文件的库,名为:
csv
。csv 库中有4个常用的对象:
csv.reader
:以列表的形式返回读取的数据。csv.writer
:以列表的形式写入数据。csv.DictReader
:以字典的形式返回读取的数据。csv.DictWriter
:以字典的形式写入数据。
读取csv文件
假设现在要读取的csv文件内容如下:
可以看到,该文件的第一行表明数据类型,我们暂且称之为
header
。从第2行开始,保存的是设备采集到的数据。使用
csv.reader
读取数据# 导入 csv 库 import csv # 以读方式打开文件 with open("data.csv", mode="r", encoding="utf-8-sig") as f: # 基于打开的文件,创建csv.reader实例 reader = csv.reader(f) # 获取第一行的header # header[0] = "设备编号" # header[1] = "温度" # header[2] = "湿度" # header[3] = "转速" header = next(reader) # 逐行获取数据,并输出 for row in reader: print("{}{}: {}={}, {}={}, {}={}".format(header[0], row[0], header[1], row[1], header[2], row[2], header[3], row[3]))
程序运行结果如下:
设备编号0: 温度=31, 湿度=20, 转速=1000 设备编号1: 温度=30, 湿度=22, 转速=998 设备编号2: 温度=32, 湿度=23, 转速=1005
使用
csv.DictReader
读取数据# 导入 csv 库 import csv # 打开文件 with open("data.csv", encoding="utf-8-sig", mode="r") as f: # 基于打开的文件,创建csv.DictReader实例 reader = csv.DictReader(f) # 输出信息 for row in reader: print("设备编号{}: 温度={}, 湿度={}, 转速={}".format(row["设备编号"], row["温度"], row["湿度"], row["转速"]))
程序运行结果如下:
设备编号0: 温度=31, 湿度=20, 转速=1000 设备编号1: 温度=30, 湿度=22, 转速=998 设备编号2: 温度=32, 湿度=23, 转速=1005
写入csv文件
假设我们现在要创建一个csv文件,将数据保存为如下形式:
使用
csv.writer
写入数据# 导入 csv 库 import csv # 创建列表,保存header内容 header_list = ["设备编号", "温度", "湿度", "转速"] # 创建列表,保存数据 data_list = [ [0, 31, 20, 1000], [1, 30, 22, 998], [2, 32, 33, 1005] ] # 以写方式打开文件。注意添加 newline="",否则会在两行数据之间都插入一行空白。 with open("new_data.csv", mode="w", encoding="utf-8-sig", newline="") as f: # 基于打开的文件,创建 csv.writer 实例 writer = csv.writer(f) # 写入 header。 # writerow() 一次只能写入一行。 writer.writerow(header_list) # 写入数据。 # writerows() 一次写入多行。 writer.writerows(data_list)
使用
csv.DictWriter
写入数据# 导入 csv 库 import csv # 创建 header 列表 header_list = ["设备编号", "温度", "湿度", "转速"] # 创建数据列表,列表的每个元素都是字典 data_list = [ {"设备编号": "0", "温度": 31, "湿度": 20, "转速": 1000}, {"设备编号": "1", "温度": 30, "湿度": 22, "转速": 998}, {"设备编号": "2", "温度": 32, "湿度": 23, "转速": 1005}, ] # 以写方式打开文件。注意添加 newline="",否则会在两行数据之间都插入一行空白。 with open("new_data.csv", mode="w", encoding="utf-8-sig", newline="") as f: # 基于打开的文件,创建 csv.DictWriter 实例,将 header 列表作为参数传入。 writer = csv.DictWriter(f, header_list) # 写入 header writer.writeheader() # 写入数据 writer.writerows(data_list)
关于写入,需要注意:
- 在打开文件时,需要添加
newline = ""
。否则,会在每2行有效内容之间添加一行空白。 - 如果要保存的内容有中文,而且之后需要用Excel打开文件,那么需要选用
utf-8-sig
编码。如果使用utf-8
编码,会导致使用Excel查看文件时中文乱码。
-
python处理csv文件
2017-10-19 18:46:42python处理csv文件,csv表示逗号分隔值(Comma-Separated Values),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目... -
Python对CSV文件数据进行可视化
2020-12-21 15:07:48从网上下载数据,并对这些数据进行可视化。 我们将访问并可视化两种常见格式存储的数据:CSV和JSON。分别使用Python中的csv以及...2、分析CSV数据 直接在Python中调用csv模块,尝试着打印csv文件每行包含什么数据,是否 -
Python 使用csv库处理CSV文件
2022-06-07 08:47:04python 处理csv文件基础 -
python数据处理之如何选取csv文件中某几行的数据
2021-01-01 15:52:52有些人看到这个问题觉得不是问题,是嘛,不就是df.col[]函数嘛,其实忽略了一个重点,那就是我们要省去把csv文件全部读取这个过程,因为如果在面临亿万级别的大规模数据,得到的结果就是boom,boom,boom。... -
Python实现 多进程导入CSV数据到 MySQL
2020-12-23 22:33:28前段时间帮同事处理了一个把 CSV 数据导入到 MySQL 的需求。两个很大的 CSV 文件, 分别有 3GB、2100 万条记录和 7GB、3500 万条记录。对于这个量级的数据,用简单的单进程/单线程导入 会耗时很久,最终用了多进程... -
python处理csv数据排序-python – 使用pandas对csv进行排序和分组
2020-11-11 13:52:08我导入一个包含以下内容的CSV文件:Id; PartNrInt; Some; other; stuff;R1; 1234-5678; x1; y1; z1;R2; 1234-6789; x2; y2; z2;R3; 1234-5678; x3; y3; z3;然后我有一个数据库,其中包含每个PartNrInt的附加数据.我... -
Python对csv文件指定单元格的处理
2020-12-22 07:35:33一般的csv文件都有规范的表头和对应的每行数据,前两张图片中打开的都是规范的csv文件,后两张图片打开的是非规范的csv文件,而Python的csv库中也只有对csv文件整行的操作,并没有像excel一样可以对任意单元格 -
Python读取和处理csv数据
2022-05-08 21:06:141、如何读取csv数据? 实际案例: http://quotes.money.163.com/stock/,我们可以通过网站获取了中国股市(深市)数据集,它以csv数据格式存储: 请将平安银行这只股票,在2016年中成交量超过50000000的记录存储到... -
Python处理CSV文件
2022-02-25 10:45:34结果是这样的(我这里处理了多个上面截图的CSV文件) 下面附代码 import os import pandas as pd import numpy as np import xlwt workbook = xlwt.Workbook() sheet = workbook.add_sheet("Sheet Name1") ... -
python处理CSV文件(读取、写入、数据集成)
2022-04-30 13:14:41循环获取指定列的单个数据,处理后保存到列表中 import csv import geohash jingdu=[] weidu=[] Value=[] def read_csv(): with open("train.csv",'r') as fp: reader=csv.DictReader(fp) for x in reader: ... -
py代码-处理csv文件重复数据
2021-07-14 17:56:12py代码-处理csv文件重复数据 -
python对csv文件的处理,pandas 数据预处理csv,案例详细
2022-01-05 12:27:23文章目录csv文件的导入CSV文件的导出不导出行号和标签,可分别将index或header设置为False使用columns参数设置想导出的列数据清理分组排序删除缺失值处理缺失值的删除缺失值的填充 papadas的用法请参考pandas数据... -
Python csv文件的读写操作实例详解
2021-01-02 20:18:31这篇文章主要介绍了Python csv文件的读写操作实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python内置了csv模块,用它可以方便的操作csv文件。 1、... -
Python从CSV文件导入数据和生成简单图表
2020-11-20 20:13:20我们已经完成Python的基础环境搭建工作,现在我们尝试导入CSV数据我们准备一个csv测试数据,文件名是csv-test-data.csv数据。我们将文件传到Linux上准备导入的代码我们运行代码首先导入csv模块以便能访问所需的方法... -
Python数据操作—处理CSV数据
2018-07-29 21:30:21从CSV读取数据(逗号分隔值)是数据科学的基本需求。 通常,我们从各种来源获取数据,这些数据可以导出为CSV格式,以便其他系统可以使用这些数据。 Pandas库提供了一些功能函数,我们可以使用该功能完整地读取CSV文件... -
python读取csv文件数据并取出其中某个字段存入文件
2021-01-13 14:31:03在学习python过程中,遇到一种情况,要读取.csv文件的数据,然后取出其中某个字段,然后再写入到一个文件中,用于数据的比对,代码如下: import csv import hashlib from itertools import islice from openpyxl ...