写在前面:
在网络爬虫中我们一般都是爬取的数据,最后一般会写入到excel文件中,所以不可避免的要用到csv模块,所以弄清楚csv模块是如何写入文件的就显得十分重要了。这里要说的数据类型不是dataframe,因为那样很容易就弄清楚是怎么写入的,本文主要介绍要写入的数据存储在列表中的情形,比如:
data = {"id": "123", "sex": "male"}
接下来我们将会详细说明csv模块是如何写入文件的
首先我们要知道写入文件的基本语法结构如下
import csv
data = {"id": "123", "sex": "male"}
file_name = "D://wangyang//练习的python程序//网络爬虫//writefile.csv"
with open(file_name, "w+", errors="ignore") as f:
f_csv = csv.writer(f)
f_csv.writerows(data)
一、open函数的简单介绍
这里我们简要介绍一下open函数的一些用法,
详细介绍可以参考open函数——菜鸟驿站
1、第一个参数(file_name)
需要填文件名(包含绝对路径+文件名),比如
file_name = "D://wangyang//练习的python程序//网络爬虫//writefile.csv"
表示在电脑D盘的wangyang文件夹中的网络爬虫文件里的writefile.csv文件
2、第二个参数,写入模式
更多模式如下,可以根据需要进行选择
注意:不管选择哪种写入模式,在运行程序之前都要把文件关闭,否则会报错,因为它比较害羞你看着它的话,它是没有办法写入的!
3、可选参数
open函数中还有很多可选参数,可以根据需要进行选择,这里主要介绍以下两个,详细的介绍可以在网上查
3.1 errors
errors="ignore"表示当写入文档遇到错误是自动跳过,写入下一个元素。因为有可能在爬虫的过程中有none值,写入的时候会报错,这时我们忽略它。
3.2 newline
newline=""表示不要空行
比如
import csv
data = {"id": "123", "sex": "male"}
x1 = str("你好")
data2 = [["id", "123"], x1, "sex", "male"]
file_name = "D://wangyang//练习的python程序//网络爬虫//writefile.csv"
with open(file_name, "w+", errors="ignore") as f:
f_csv = csv.writer(f)
f_csv.writerows(data2)
结果如下
给open函数加上newline参数后,如
import csv
data = {"id": "123", "sex": "male"}
x1 = str("你好")
data2 = [["id", "123"], x1, "sex", "male"]
file_name = "D://wangyang//练习的python程序//网络爬虫//writefile.csv"
with open(file_name, "w+", errors="ignore", newline="") as f:
f_csv = csv.writer(f)
f_csv.writerows(data2)
结果如下
二、csv模块中的函数
这里主要介绍的是writerow与writerows的区别,我们先简单看看下面的例子,要写入的文件如下
data = ["id", "123", "sex", "male"]
其他代码均一样
用writerow写入的结果
用writerows写入的结果
首先我们要了解到csv写入的是一个可迭代对象(比如列表,字符串),writerow只写入一维的数据,而writerows写入二维的数据,具体解释如下
两者主要的区别就是:writerow只拆一次写入,writerows拆两次写入(这里的拆都是拆的可迭代对象,如列表、字符串等)
2.1 writerow
writerow只拆一次,拆的原则是从外往里拆,第一次将列表拆成四个对象“id”,"123","sex","male",好了只能拆一次,所以依次把这四个对象分别写入单元格中。
再比如我们看下面的例子
data2= [["id", "123"], "sex", "male"]
首先拆一次,得到下面三个对象
第一个对象:列表["id","123"];第二、三个对象分别是:"sex","male"(两者都是字符串)
好了,因为只能拆一次,所以把这三个对象分别写入单元格中,如下所示
2.2 writerows
wirterows拆两次,这里说的不是能拆两次,是必须拆两次!看之前的例子,首先拆第一次,得到四个对象,分别是
"id","123","sex","male"(均是字符串)
因为必须拆两次,所以还要继续拆(因为它们都是字符串,只能拆可迭代对象,所以可以继续),比如第一个
“id”可以拆开为,i,d,分别写入单元格中,在同一行中
另起一行拆第二个对象,后面类似。
再考虑例子data2,首先拆第一次,得到三个对象,好的,接下来来拆第一个对象
因为它是一个列表,可迭代对象之一,所以能拆,拆成两个对象分别为:“id”,"123"(两个都是字符串,还是能拆的,但是不能继续拆了,因为已经拆了两次了),所以id在同一个单元格内,与“123”在同一行,另起一行继续拆别的对象,所以结果如下:
最后看下面的例子
data3 = [[["id", "123"], "sex"], "male"]
现在猜猜看最后的结果是什么
writerow:
writerows:
是不是跟你猜的结果一样呢?