CSV文件存储
CSV其文件以纯文本形式存储表格数据。CSV文件是一个字符序列,可以由任意数目的记录组成,各种记录由某种换行符分隔开。它比Excel文件更加简洁,XLS文本是电子表格,包含文本、数值、公式和格式等内容,CSV中则不包含这些,就是以特定字符作为分隔符的纯文本,结构简单清晰,所以有时候使用CSV来存储数据是比较方便的。
1.写入
import csvwith open('data.csv','w') as csvfile:writer = csv.writer(csvfile)writer.writerow(['id','name','age'])writer.writerow(['10001','Mike',20])writer.writerow(['10002','Bob',21])writer.writerow(['10003','Jered',22])
这里首先打开data.csv文件,指定打开模式w写入,获得文件句柄,随后调用csv库的writer方法初始化写入对象,传入该句柄,然后用writerow方法传入每行的数据。
运行结束后会生成一个名为data.csv的文件,打开如图所示。
这时候如果直接打印输出会发现分隔符这时是默认的以逗号分隔,如果想修改列与列之间的分隔符,可以传入delimiter参数。
import csvwith open('data.csv','w') as csvfile:writer = csv.writer(csvfile,delimiter=' ')writer.writerow(['id','name','age'])writer.writerow(['10001','Mike',20])writer.writerow(['10002','Bob',21])writer.writerow(['10003','Jered',22])
这时就会发现列于列之间的分隔符已经变成了空格。
另外我们也可以调用writerows方法同时写入多行,此时参数需要传入二维列表。
import csvwith open('data.csv','w') as csvfile:writer = csv.writer(csvfile)writer.writerow(['id','name','age'])writer.writerows([['10001','Mike',20],['10002','Bob',21],['10003','Jered',22]])
但是,在一般情况下爬虫爬取的数据都是结构化数据,我们一般会用字典表示。csv库也提供了字典的写入方式。
import csvwith open('data.csv','w') as csvfile:filednames = ['id','name','age']writer = csv.DictWriter(csvfile,fieldnames=filednames)writer.writeheader()writer.writerow({'id':'10001','name':'Mike','age':20})writer.writerow({'id':'10002','name':'Bob','age':21})writer.writerow({'id':'10003','name':'Jared','age':22})
这里定义了三个字段,用filedname表示,然后传给DictWriter方法以初始化一个字典写入对象,并赋值给writer变量。接着用writeheader方法先写入头信息,再调用writerow方法传入相应字典。
另外,如果想要追加写入,可以修改文件的打开模式,即把open函数的第二个参数改成a,代码如下:
import csvwith open('data.csv','a') as csvfile:filednames = ['id','name','age']writer = csv.DictWriter(csvfile,fieldnames=filednames)writer.writerow({'id':'10004','name':'Lan','age':25})
这样数据就会被追加写入到文件中。
如果要写入中文内容,可能会遇到编码的问题,我们可以给open指定编码格式。
import csvwith open('data.csv','a',encoding='utf-8') as csvfile:filednames = ['id','name','age']writer = csv.DictWriter(csvfile,fieldnames=filednames)writer.writerow({'id':'10004','name':'王伟','age':25})
如果接触过pandas库,可以调用DataFrame对象的to_csv方法将数据写入到CSV文件中。
import pandas as pddata = [{'id':'10004','name':'王伟','age':25},{'id':'10002','name':'Bob','age':21},{'id':'10003','name':'Jared','age':22}
]df = pd.DataFrame(data)
df.to_csv('data.csv',index=False)
我定义了几个字典数据,组成列表,赋值给data。用pandas的DataFrame类新建了一个DataFrame对象,参数传入data,最后调用df的to_csv方法将数据保存为CSV文件
2.读取
我们同样可以使用csv库来读取文件。例如,把上面写入的文件读取出来。
mport csvwith open('data.csv','r',encoding='utf-8') as csvfile:reader = csv.reader(csvfile)for row in reader:print(row)
运行结果如下:
[‘id’, ‘name’, ‘age’]
[‘10004’, ‘王伟’, ‘25’]
[‘10002’, ‘Bob’, ‘21’]
[‘10003’, ‘Jared’, ‘22’]
另外也可以使用pandas的read_csv方法读取数据。
import pandas as pddf = pd.read_csv('data.csv')
print(df)
运行结果如下:
id name age
0 10004 王伟 25
1 10002 Bob 21
2 10003 Jared 22
这里的df实际为DataFrame对象,如果只想读取文件中的数据,可以进一步将df转化为列表或者元组。
import pandas as pddf = pd.read_csv('data.csv')
data = df.values.tolist()
print(data)
这里调用了df的values属性,再调用tolist方法转化为列表,运行结果如下:
[[10004, ‘王伟’, 25], [10002, ‘Bob’, 21], [10003, ‘Jared’, 22]]
另外直接对df进行遍历,也能达到列表类型的结果。
import pandas as pddf = pd.read_csv('data.csv')
for index,row in df.iterrows():print(row.tolist())