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()语句了
Après l'avoir lu brièvement, de nombreuses questions se posent~
#csv_file = open("rent.csv","wb")
#Cette phrase est supprimée et répétéeMettre à jour un peu
csv est un fichier au format texte et ne prend pas en charge l'écriture binaire, n'ouvrez donc pas le fichier en mode binaire et les données n'ont pas besoin d'être converties en octets.
Plus de mises à jour
根本原因是楼主看错文档,导致了理解有误~
Changez le paramètre d'ouverture 'wb' en 'w'
La vraie raison pour laquelle python2.x doit être écrit en mode 'wb'
Lors de l'écriture CSV dans python2.x, le paramètre 'b' doit être ajouté à la création du fichier CSV, c'est-à-dire csv.writer(open('test.csv','wb')), sinon entrelacé des lignes apparaîtront. L'explication trouvée sur Internet est la suivante : lorsque Python écrit un fichier normalement, 'n' est ajouté par défaut à la fin de chaque ligne, qui est 0x0D, et la fin de la commande writerow ajoutera un autre 0x0D0A, donc pour les systèmes Windows, il s'agit de deux lignes. Lorsque vous utilisez le paramètre 'b' pour écrire des fichiers en binaire, la valeur par défaut du système est de ne pas ajouter 0x0D
.Dans python3.x, le paramètre newline='' est utilisé pour atteindre cet objectif