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 = ader(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']\
.ains('Z')) | (data_frame['Cost'] > 600.0), :]
data_frame_value__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 = ader(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__csv(output_file, index=False)
python怎么读csv数据
这⾥最重要的新命令就是简洁的 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 = repile(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 = ader(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__csv(output_file, index=False)
使⽤ pandas 时,可以使⽤ startwith 函数来搜索数据,不⽤再使⽤笨重冗长的正则表达式了。要运⾏这个脚本,在命令⾏中输⼊以下命令,然后按回车键:
python pandas_value_matches_pattern.py supplier_data.csv\

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。