python如何处理csv_Python处理CSV文件的几个方法

筛选特定的行

有些时候,你并不需要文件中所有的数据。例如,你可能只需要一个包含特定词或数字的行的子集,或者是与某个具体日期关联的行的子集。在这些情况下,可以用 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\

你可能感兴趣的:(python如何处理csv)