Python处理CSV⽂件(⼀)
CSV ⽂件
CSV(comma-separated value,逗号分隔值)⽂件格式是⼀种⾮常简单的数据存储与分享⽅式。CSV ⽂件将数据表格存储为纯⽂本,表格(或电⼦表格)中的每个单元格都是⼀个数值或字符串。与 Excel ⽂件相⽐,CSV ⽂件的⼀个主要优点是有很多程序可以存储、转换和处理纯⽂本⽂件;相⽐之下,能够处理 Excel ⽂件的程序却不多。所有电⼦表格程序、⽂字处理程序或简单的⽂本编辑器都可以处理纯⽂本⽂件,但不是所有的程序都能处理 Excel ⽂件。尽管 Excel 是⼀个功能⾮常强⼤的⼯具,但是当你使⽤ Excel ⽂件时,还是会被局限在Excel 提供的功能范围内。CSV ⽂件则为你提供了⾮常⼤的⾃由,使你在完成任务的时候可以选择合适的⼯具来处理数据——如果没有现成的⼯具,那就使⽤ Python ⾃⼰开发⼀个!
当你使⽤ CSV ⽂件时,确实会失去某些 Excel 功能:在 Excel 电⼦表格中,每个单元格都有⼀个定义好的“类型”(数值、⽂本、货币、⽇期等),CSV ⽂件中的单元格则只是原始数据。幸好,Python 在识别不同数据类型⽅⾯相当聪明。使⽤ CSV ⽂件的另⼀个问题是它只能保存数据,不能保存公式。但是,通过将数据存储(CSV ⽂件)和数据处理(Python 脚本)分离,你可以很容易地在不同数据集上进⾏加⼯处理。当数据存储和数据处理过程分开进⾏时,错误(不管是数据处理中的错误,还是数据存储中的错误)不但更容易被发现,⽽且更难扩散。
(1) 打开⼀个新的电⼦表格,向其中加⼊数据,如图 2-1 所⽰。
图 2-1:向 supplier_data.csv ⽂件中添加数据
(2) 将⽂件保存在桌⾯上,⽂件名为 supplier_data.csv。
要确认 supplier_data.csv 确实是纯⽂本⽂件。
(1) 将所有打开的窗⼝最⼩化,在桌⾯上到 supplier_data.csv。
(2) 在⽂件上点击⿏标右键。
(3) 选择“Open with”,然后选择⼀个⽂本编辑器,如 Notepad、Notepad++ 或 Sublime Text。
当你在⽂本编辑器中打开这个⽂件时,它看上去应该如图 2-2 所⽰。
图 2-2:Notepad 中的 supplier_data.csv ⽂件
正如你所看到的,这个⽂件是⼀个简单的纯⽂本⽂件。每⾏包含 5 个由逗号分隔的值。对这种⽂件的另⼀种理解是由逗号划定了 Excel 电⼦表格中的 5 列。现在你可以关闭这个⽂件了。
基础Python与pandas
前⾔中曾提到过,提供两种版本的代码来完成具体的数据处理任务。第⼀种代码版本展⽰了如何使⽤基础 Python 来完成任务。第⼆种版本展⽰了如何使⽤ pandas 来完成任务。你会看到,使⽤ pandas 完成任务相对来说更容易,需要的代码更少。所以,如果你已经理解了pandas 简化了的编程概念和操作,只是要简单完成任务的话,pandas 版的代码就⾮常有⽤。但是,先介绍基础 Python 版本的代码,以使你学会如何使⽤通⽤的编程概念和操作来完成任务。通过介绍两种代码版本,希望可以给你如下选择:⼀是使⽤ pandas 快速完成任务;⼆是学习通⽤的编程技能,并在提⾼编码能⼒的基础上获得解决问题的能⼒。
读写CSV⽂件
基础Python,不使⽤csv模块
现在开始学习如何使⽤基础 Python 代码来读写和处理 CSV ⽂件(不使⽤内置的 csv 模块)。先看看
下⾯的⽰例代码,然后当你使⽤ csv 模块时,就会知道代码在幕后都做了些什么。
要处理 CSV ⽂件,先新建⼀个 Python 脚本,名为 1csv_read_with_simple_parsing_and_write.py。
在 Spyder 或⼀个⽂本编辑器中输⼊下列代码:
1 #!/usr/bin/env python3
2 import sys
3
4 input_file = sys.argv[1]
5 output_file = sys.argv[2]
6
7 with open(input_file, 'r', newline='') as filereader:
8 with open(output_file, 'w', newline='') as filewriter:
9 header = adline()
10 header = header.strip()
11 header_list = header.split(',')
12 print(header_list)
13 filewriter.write(','.join(map(str,header_list))+'\n')
python怎么读取桌面上的文件14 for row in filereader:
15 row = row.strip()
16 row_list = row.split(',')
17 print(row_list)
18 filewriter.write(','.join(map(str,row_list))+'\n')
在桌⾯上,将程序保存为 1csv_read_with_simple_parsing_and_write.py。
图 2-3、图 2-4 和图 2-5 分别展⽰了使⽤ Anaconda Spyder、Notepad++(Windows)和 TextWrangler(macOS)编写脚本的界⾯。
图 2-3:Anaconda Spyder 中的 Python 脚本 1csv_read_with_simple_parsing_and_write.py
图 2-4:Notepad++(Windows)中的 Python 脚本 1csv_read_with_simple_parsing_and_write.py
图 2-5:TextWrangler(macOS)中的 Python 脚本 1csv_read_with_simple_parsing_and_write.py
在运⾏脚本并查看输出之前,先研究⼀下脚本中的代码想做些什么。这⾥将按照顺序依次讨论每个代码块(下⾯提到的⾏编号指的是屏幕截图中的⾏编号)。
#!/usr/bin/env python3
import sys
第 1 ⾏是注释⾏,可以使脚本在不同的操作系统之间具有可移植性。第 3 ⾏代码导⼊ Python 内置的 sys 模块,可以使你在命令⾏窗⼝中向脚本发送附加的输⼊。
input_file = sys.argv[1]
output_file = sys.argv[2]
第 5 和 6 ⾏代码使⽤ sys 模块的 argv 参数,它是⼀个传递给 Python 脚本的命令⾏参数列表,也就是当你运⾏脚本时在命令⾏中输⼊的内容。下⾯给出了⼀个在 Windows 系统中使⽤命令⾏参数读取 CSV 格式的输⼊⽂件和写⼊ CSV 格式的输出⽂件的例⼦:
python script_name.py "C:\path\to\input_file.csv""C:\path\to\output_file.csv"
第⼀个词 python 告诉计算机使⽤ Python 程序来处理其余的命令⾏参数。Python 收集其余的参数,放⼊ argv 这个特殊的列表中。列表中的第⼀个元素 argv[0] ⽤作脚本名称,所以 argv[0] 表⽰ script_name.py。下⼀个命令⾏参数是 “C:\path\to\input_file.csv”,即CSV 输⼊⽂件的路径和⽂件名。Python 将这个参数保存在 argv[1] 中,所以脚本第 5 ⾏代码将这个值赋给变量 input_file。最后⼀个命令⾏参数是 “C:\path\to\output_file.csv”,即 CSV 输出⽂件的路径和⽂件名。Python 将这个参数保存在 argv[2] 中,第 6 ⾏代码把这个值赋给了变量 output_file。
with open(input_file, 'r', newline='') as filereader:
with open(output_file, 'w', newline='') as filewriter:
第 8 ⾏代码是⼀个 with 语句,将 input_file 打开为⼀个⽂件对象 filereader。‘r’ 表⽰只读模式,说明打开 input_file 是为了读取数据。第 9 ⾏代码是另⼀个 with 语句,将 output_file 打开为⼀个⽂件对象 filewriter。‘w’ 表⽰可写模式,说明打开 output_file 是为了写⼊数据。with 语句⾮常有⽤,因为它可以在语句结束时⾃动关闭⽂件对象。
header = adline()
header = header.strip()
header_list = header.split(',')
第 10 ⾏代码使⽤⽂件对象的 readline ⽅法读取输⼊⽂件中的第⼀⾏数据,在本例中,第⼀⾏是标题⾏,读⼊后将其作为字符串并赋给名为 header 的变量。第 11 ⾏代码使⽤ string 模块中的 strip 函数去掉 header 中字符串两端的空格、制表符和换⾏符,并将处理过的字符串重新赋给 header。第 12 ⾏代码使⽤ string 模块的 split 函数将字符串⽤逗号拆分成列表,列表中的每个值都是⼀个列标题,最后将列表赋给变量 header_list。
print(header_list)
filewriter.write(','.join(map(str,header_list))+'\n')
第 13 ⾏代码是⼀个 print 语句,将 header_list 中的值(也就是列标题)打印到屏幕上。
第 14 ⾏代码使⽤ filewriter 对象的 write ⽅法将 header_list 中的每个值写⼊输出⽂件。因为这⾏代码⽐较复杂,所以需要仔细说明⼀下。map 函数将 str 函数应⽤于 header_list 中的每个元素,确保每个元素都是字符串。然后,join 函数在 header_list 中的每个值之间插⼊⼀个逗号,将这个列表转换为⼀个字符串。在此之后,在这个字符串最后添加⼀个换⾏符。最后,filewriter 对象将这个字符串写⼊输出⽂件,作为输出⽂件的第⼀⾏。
for row in filereader:
row = row.strip()
row_list = row.split(',')
print(row_list)
filewriter.write(','.join(map(str,row_list))+'\n')
第 15 ⾏代码创建了⼀个 for 循环,在输⼊⽂件剩余的各⾏中迭代。第 16 ⾏代码使⽤ strip 函数除去每⾏字符串两端的空格、制表符和换⾏符,然后将处理过的字符串重新赋给变量 row。第 17 ⾏使代码⽤ split 函数⽤逗号将字符串拆分成⼀个列表,列表中的每个值都是这⾏中某⼀列的值,然后,将列表赋给变量 row_list。第 18 ⾏代码将 row_list 中的值打印到屏幕上。第 19 ⾏代码将这些值写⼊输出⽂件。
脚本对输⼊⽂件中的每⼀⾏数据都执⾏第 16~19 ⾏代码,因为这 4 ⾏代码在第 15 ⾏代码中的 for 循环下⾯是缩进的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论