浅谈python对csv文件的处理

Posted 如知

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈python对csv文件的处理相关的知识,希望对你有一定的参考价值。

 

先看一下CSV文件的定义:

CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

CSV 是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。

对于实际项目中,CSV文件是非常常见的数据格式,属于结构化数据。当然,有的说法只把关系型数据库中的数据当做结构化数据,而把CSV当做半结构化数据。但无论怎么分类,JSON、XML是比较标准的半结构化数据。而CSV数据与关系型数据更相近。甚至可以认为就是关系型数据表的文件表现形式。

python对于CSV文件的处理,是非常方便的。感觉与处理Excel文件类似,有两大类方法。一种是按照文件方式进行读写,另一种是用pandas模块处理。前一种方法与其他文本文件的处理方式类似,可以获取CSV文件的所有数据,然后再按照取得的数据元素进行计算处理。而pandas属于python用于数据分析的模块,有更强大的数据处理能力。可以想象,在pandas处理中,CSV的数据如同矩阵一样的数据块。再结合pandas强大的各种数据分析工具可进行更加复杂的数据处理。

以下举例说明:

data.csv:

id,name,age
0001,mike,30
0002,will,31
0003,alex,33
0004,john,34
0005,mark,32
0006,rose,31
0008,joan,33
0009,kelinton,34
0007,bush,32

一、按照文件方式读写CSV

1.读取CSV文件:def csv_reader():

    import csv
with open(\'data.csv\', \'r\') as f:
reader = csv.reader(f)
print(type(reader)) #>>><class \'_csv.reader\'>
reader_list=list(reader)
print(type(reader_list),reader_list)
     #>>><class \'list\'> [[\'id\', \'name\', \'age\'], [\'0001\', \'mike\', \'30\'], [\'0002\', \'will\', \'31\'], ……,] 
for i,line in enumerate(reader_list):
print("%s行:%s"%(i,line)) #可以把0行当做表头head,其他作为数据行。

#>>>

0行:[\'id\', \'name\', \'age\']
1行:[\'0001\', \'mike\', \'30\']
2行:[\'0002\', \'will\', \'31\']
3行:[\'0003\', \'alex\', \'33\']
4行:[\'0004\', \'john\', \'34\']
5行:[\'0005\', \'mark\', \'32\']
6行:[\'0006\', \'rose\', \'31\']
7行:[\'0008\', \'joan\', \'33\']
8行:[\'0009\', \'kelinton\', \'34\']
9行:[\'0007\', \'bush\', \'32\']

通过上面程序,可以看出,CSV的reader函数可以获取CSV文件数据,但其本身是一个\'_csv.reader\'类对象,需要经过list转换为列表。经过输出后,该CSV文件就是一个嵌套的列表。每一行数据是一个list,然后各行综合起来是一个大的list。输出各行的数据如上面所示。

2.读取、写入CSV及TXT文件。这里比较一下用csv模块写入的csv文件与一般文本文件的写入有何不同?

def csv_read_write():
import csv
with open(\'data.csv\', \'r\') as f_r, \\
open(\'data_w.csv\', \'w\',newline=\'\') as f_w, \\
open(\'data_w.txt\', \'w\') as f_wt:
reader = csv.reader(f_r)
writer = csv.writer(f_w)
for i in reader:
str=f"{i[0]},{i[1].title()},{i[2]}\\n"
# #写入csv,调用csv方法,如果数据以str形式,得到的是每个字符都以逗号分隔。
data=[i[0],i[1].title(),i[2]] #正如读取csv获取的是列表一样,写入csv也必须以列表的形式。
# print(data)
writer.writerow(data)
f_wt.write(str) #以一般文本的形式str写入文件,与csv方法写入列表的结果相同。
执行结果显示,\'data_w.csv\' 与 \'data_w.txt\'内容完全一样。这也就说明CSV文件本身就是文本文件格式,只不过是一种格式化的,用逗号分隔符分隔的文本文件。从使用角度,
写入一般的文本文件不用import模块,而如果用CSV模块,就要按照CSV模块的函数进行读写。

二、按照pandas模块读写CSV

def pandas_csv():
import pandas as pd
df = pd.read_csv(\'data.csv\')
print(type(df.to_string()),"\\n",df.to_string())  #1
print(type(df),"\\n",df)  #2
    nme = ["Google", "Runoob", "Taobao", "Wiki"]
st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
ag = [90, 40, 80, 98]
# 字典
dict = {\'name\': nme, \'site\': st, \'age\': ag}
df = pd.DataFrame(dict)
# 保存 dataframe
df.to_csv(\'site.csv\')
#1>>>
type(df.to_string()),"\\n",df.to_string()

<class \'str\'>
   id name age
0 1 mike 30
1 2 will 31
2 3 alex 33
3 4 john 34
4 5 mark 32
5 6 rose 31
6 8 joan 33
7 9 kelinton 34
8 7 bush 32

#2>>>type(df),"\\n",df

<class \'pandas.core.frame.DataFrame\'>
   id name age
0 1 mike 30
1 2 will 31
2 3 alex 33
3 4 john 34
4 5 mark 32
5 6 rose 31
6 8 joan 33
7 9 kelinton 34
8 7 bush 32

以上的输出内容完全一样,只是df与df.string()的数据类型不一样。而且,因为pandas是面向数据分析的,所以在读取CSV文件数据之后,自动添加了一列数据,相当于索引,
可用于数据分析。
site.csv文件内容:
,name,site,age
0,Google,www.google.com,90
1,Runoob,www.runoob.com,40
2,Taobao,www.taobao.com,80
3,Wiki,www.wikipedia.org,98

可以看到,df.to_csv(\'site.csv\'),dataframe 在写入csv文件数据的时候也是自动增加了索引列。

 

以上是关于浅谈python对csv文件的处理的主要内容,如果未能解决你的问题,请参考以下文章

浅谈工作以及csv的处理

15种Python片段去优化你的数据科学管道

python 读取多个csv文件中某一列,并生成一个新csv文件

Python实现对csv的批量处理并保存

Python实现对csv的批量处理并保存

python如何根据csv中一列的内容对另一列进行写入