Home

韧桂

思考,总结

VS code 文件的使用

文件的打开与关闭

通过open()函数打开一个文件

<变量名> = open(<文件名>,<打开模式>)

open()函数有两个参数:文件名和打开模式。文件名可以是文件的实际名字,也可以是包含完整路径的名字。打开模式用于控制使用何种方式打开文件。

文件的打开模式:

rwxb 可以和 bt+ 组合实用

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&amp;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