python文档(传送门)关于CSV的一个用法示例:
文件打开的mode是“wb”
with open('rent.csv','wb') as csv_file:
且与Pythone3里面字符串和二进制数据是两种类型,所以要将str类型转换成bytes类型
#把str类型的housetitle、house_location、house_money编码成bytes类型
house_title = house_title.encode("utf8")
house_location = house_location.encode("utf8")
house_money = house_money.encode("utf8")
house_url = house_url.encode("utf8")
#查看house_title等的类型
print(type(house_title),type(house_location),type(house_money),type(house_url))
# 向csv文件写入数据
with open('rent.csv','wb') as csv_file:
csv_writer = csv.writer(csv_file,delimiter=',')
csv_writer.writerow([house_title, house_location, house_money, house_url])
错误提示
可以看到这里输出的house_title, house_location, house_money, house_url类型都是bytes
然而下面还是报了类型错误
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import requests
import csv
url = "http://nj.58.com/pinpaigongyu/pn/{page}/?minprice=1000_1500"
page = 1
print("fetch: ", url.format(page=page))
# 抓取目标页面
response = requests.get(url.format(page=page))
# 创建一个BeautifulSoup对象
html = BeautifulSoup(response.text, "lxml")
# 获取class=list下的所有li元素
house_list = html.select(".list > li")
for house in house_list:
house_title = house.select("h2")[0].string
house_url = urljoin(url, house.select("a")[0]["href"])
house_info_list = house_title.split()
house_location = house_info_list[1]
house_money = house.select(".money")[0].select("b")[0].string
#把str类型的housetitle、house_location、house_money编码成bytes类型
house_title = house_title.encode("utf8")
house_location = house_location.encode("utf8")
house_money = house_money.encode("utf8")
house_url = house_url.encode("utf8")
#查看house_title等的类型
print(type(house_title),type(house_location),type(house_money),type(house_url))
# 向csv文件写入数据
with open('rent.csv','wb') as csv_file:
csv_writer = csv.writer(csv_file,delimiter=',')
csv_writer.writerow([house_title, house_location, house_money, house_url])
#用with的写法就不用写关闭文件的csv_file.close()语句了
Selepas membacanya secara ringkas, terdapat banyak persoalan~
#csv_file = open("rent.csv","wb")
# Ayat ini dipadamkan dan diulangKemas kini sedikit
csv ialah fail format teks dan tidak menyokong penulisan binari, jadi jangan buka fail dalam mod binari dan data tidak perlu ditukar kepada bait.
Lagi kemas kini
根本原因是楼主看错文档,导致了理解有误~
Tukar parameter terbuka 'wb' kepada 'w'
Sebab sebenar mengapa python2.x perlu ditulis dalam mod 'wb'
Apabila menulis CSV dalam python2.x, parameter 'b' mesti ditambahkan pada penciptaan fail CSV, iaitu, csv.writer(open('test.csv','wb')), jika tidak berjalin garisan akan berlaku. Penjelasan yang terdapat di Internet ialah: apabila Python menulis fail seperti biasa, 'n' ditambah pada penghujung setiap baris secara lalai, iaitu 0x0D, dan penghujung arahan baris tulis akan menambah 0x0D0A lagi, jadi untuk sistem Windows, ia adalah dua baris apabila menggunakan parameter 'b' untuk menulis fail dalam binari, lalai sistem bukan untuk menambah 0x0D
Dalam python3.x, parameter newline='' digunakan untuk mencapai tujuan ini