基本字符串分析的失败
在上一节我们讲了使用Python对CSV文件进行读写。事实上,当列中包含额外的逗号时,CSV分析会失败。
我们打开supplier_data.csv,将Cost列中的最后两个成本数量分别改为$6,015.00和$1,006,015.00,如下图所示。
之前的脚本是按照行中的逗号分析每行数据的,这会让脚本错误地拆分最后两行的数据,因为数据中有逗号。
有很多方法可以改进这个脚本中的代码,使它可以正确地处理包含逗号的数值。我们可以使用正则表达式,但为了不使脚本复杂化,我们可以使用Python内置的csv模块。这个模块可以方便灵活地处理复杂的CSV文件。
修改后的脚本读写CSV文件
使用Python内置的csv模块处理CSV文件的一个优点是,这个模块就是被设计用于正确处理数据值中的嵌入逗号和其他复杂模式的,它可以识别出这些模式并正确地处理数据。
修改后的代码如下:
#!/usr/bin/env python3
import csv
import sys
input_file = sys.argv[1]
output_file = sys.argv[2]
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, delimiter=',')
filewriter = csv.writer(csv_out_file, delimiter=',')
for row_list in filereader:
print(row_list)
filewriter.writerow(row_list)
我们来解释一下上面的代码。
import csv
这行代码导入csv模块,以便可以使用其中的函数来分析输入文件,写入输入文件。
filereader = csv.reader(csv_in_file, delimiter=',')
filewriter = csv.writer(csv_out_file, delimiter=',')
这两行代码使用csv模块中的reader()
函数和writer()
函数分别创建了一个文件读取对象filereader
和文件写入对象filewriter
。这两个函数中的第二个参数delimiter=','
是默认分隔符,如果输入文件和输出文件都是用逗号分隔的,就不需要指定这个参数。这里指定分隔符函数,是为了防备待处理的输入文件或要写入的输出文件具有不同的分隔符,例如分号;
或制表符\t
。
filewriter.writerow(row_list)
这行代码使用filewriter
对象的writerow()
函数来将每行中的列表值写入输出文件。
我们在命令行窗口运行这个脚本,如下图所示。