进行网页采集的时候,你可能遇到CSV文件,也可能同时希望将数据保存为CSV格式。Python的csv库主要是面向本地文件,就是说你的csv文件得存储在你的电脑上,而在进行网络数据采集的时候,很多文件都是在线的。不过有一些方法可以解决这些问题:
1.手动把csv文件下载到本机,然后用python定位文件位置;
2. 写Python程序下载文件,读取之后再把源文件删除。
3. 从网上直接把文件读成一个字符串,然后转换成一个StringIO对象,使它具有文件的属性。
虽然前两个方法也可以使用,但是既然你可以轻易地把CSV文件保存在内存里,就不要再下载到本地占用磁盘空间了。直接把文件读取成字符串,然后封装成StringIO对象,让Python把它当做文件来处理,就不需要先保存为文件了。下面的程序就是获取一个CSV文件(http://pythonscraping.com/files/MontyPythonAlbums.csv),然后把每一行打印到命令行里:
from urllib.request import urlopen from io import StringIO import csv data=urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode('ascii','ignore') dataFile=StringIO(data) csvReader=csv.reader(dataFile) for row in csvReader: print(row)
可以对结果进行更细致的拆分,使用代码如下:
from urllib.request import urlopen from io import StringIO import csv data=urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode('ascii','ignore') dataFile=StringIO(data) csvReader=csv.reader(dataFile) for row in csvReader: print("The album \""+row[0]+"\" was released in "+str(row[1]))
执行结果如下:
from urllib.request import urlopen from io import StringIO import csv data=urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode('ascii','ignore') dataFile=StringIO(data) dictReader=csv.DictReader(dataFile) print(dictReader.fieldnames) for row in dictReader: print(row)