VS code 文件的使用
文件的打开与关闭
通过open()
函数打开一个文件
<变量名> = open(<文件名>,<打开模式>)
open()
函数有两个参数:文件名和打开模式。文件名可以是文件的实际名字,也可以是包含完整路径的名字。打开模式用于控制使用何种方式打开文件。
文件的打开模式:
r
,w
,x
,b
可以和 b
,t
,+
组合实用
如 rt
表示文本只读模式。rb
表示二进制文件(图片、音视频)
文件使用结束后要用 close()
方法关闭,释放文件的使用授权,该方法的使用方法如下:
<变量名>.close()
简化写法:
使用 with as
语法。在 with
控制块结束时,文件会自动关闭,所以就不需要再调用 close()
方法了。
with open('explore.txt','a',encoding='utf-8') as file:
file.write('\n'.join([question, author, answer]))
file.write('\n' + '=' * 50 + '\n')
注释:用open()
打开文本文件,获取文件操作对象,这里赋值给 file
,接着利用file
对象的write()
方法将提取的内容写入文件。
实操:
#*-*-coding:utf-8 -*-
from bs4 import BeautifulSoup
import requests
import time
with open('E:\weixinkaifa\kaifa01.txt','w',encoding='utf-8') as f:
url = 'http://wx.hyb3333.com/lists/1.html'
urls = ['http://wx.hyb3333.com/lists/1-{}.html'.format(str(i)) for i in range(1,4)]
def get_attactions(url,date=None):
wb_date = requests.get(url)
soup = BeautifulSoup(wb_date.text,'lxml')
titles = soup.select('div.img > p')
imgs = soup.select('div.img > img')
movies = soup.select('li.listfl > a')
time.sleep(1)
for title,img,movie in zip(titles,imgs,movies):
f.write("{},,{},{}\n".format(title.string,img.get('data-original'),'http://wx.hyb3333.com/play'+ movie.get('href')[6:13]+'-0-0.html'))
for single_url in urls:
get_attactions(single_url)
print(single_url)
文件的读写
JSON 文件存储
CSV 文件存储
import csv
with open('data.csv', 'w') as csvfile:
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'id': '10001', 'name': 'Mike','age': 20})
首先,打开data.csv
文件,然后指定打开的模式为 w
(即写入),获得文件句柄,随后调用 csv 库
的writer()
方法初始化写入对象,传入该句柄,然后调用 writerow()
方法传入每行的数据即可完成写入。
这里先定义了 3 个字段,用 fieldnames
表示,然后将其传给 DictWriter
来初始化一个字典写入对象,接着可以调用 writeheader()
方法先写入头信息,然后再调用 writerow()
方法传入相应字典即可。
# -*- coding:utf-8 -*-
import urllib.request
import time
import csv
import codecs
from bs4 import BeautifulSoup
def main():
# 爬取地址, 当当所有 Python 的书籍, 一共是 21 页
url = "http://search.dangdang.com/?key=python&act=input&show=big&page_index="
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
# 代理, 如果在需要代理就加上这行代码
# proxy_handler = urllib.request.ProxyHandler({
#
# })
# opener = urllib.request.build_opener(proxy_handler)
# urllib.request.install_opener(opener)
index = 1
while index <= 21:
# 发起请求
request = urllib.request.Request(url=url+str(index), headers=headers)
response = urllib.request.urlopen(request)
index = index + 1
# 解析爬取内容
parseContent(response)
time.sleep(1) # 休眠1秒
showResult()
def parseContent(response):
# 提取爬取内容中的 a 标签, 例如:
# <a
# class="pic" dd_name="单品图片"
# ddclick="act=normalResult_picture&pos=23648843_53_2_q"
# href="http://product.dangdang.com/23648843.html"
# name="itemlist-picture"
# target="_blank" title="
# 趣学Python――教孩子学编程 ">
#
# <img
# alt=" 趣学Python――教孩子学编程 "
# data-original="http://img3x3.ddimg.cn/20/34/23648843-1_b_0.jpg"
# src="images/model/guan/url_none.png"/>
# </a>
soup = BeautifulSoup(response)
temps = soup.find_all('a', class_='pic')
global books
books = books + temps
print('get books size = ' + str(len(books)))
def showResult():
fileName = 'PythonBook.csv'
# 指定编码为 utf-8, 避免写 csv 文件出现中文乱码
with codecs.open(fileName, 'w','utf-8') as csvfile:
filednames = ['书名', '页面地址', '图片地址']
writer = csv.DictWriter(csvfile, fieldnames=filednames)
writer.writeheader()
for book in books:
print(book)
# print(book.attrs)
# 获取子节点<img>
# (book.children)[0]
if len(list(book.children)[0].attrs) == 3:
img = list(book.children)[0].attrs['data-original']
else:
img = list(book.children)[0].attrs['src']
try:
writer.writerow({'书名':book.attrs['title'], '页面地址':book.attrs['href'], '图片地址': img})
except UnicodeEncodeError:
print("编码错误, 该数据无法写到文件中, 直接忽略该数据")
print('将数据写到 ' + fileName + '成功!')
if __name__ == '__main__':
books = []
main()
欢迎关注我的公众号:「韧桂」
韧桂 2018-09-07