python3.x - 【python3】中str转成bytes类型后用csv.writerow()写入csv文件仍然出错
PHPz
PHPz 2017-04-18 09:34:58
0
3
741

根本原因是Python版本问题python2.x中要求用‘wb’,python3.x中要求用'w'

首先声明:CSV文件是可以用二进制模式写入的

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

然而下面还是报了类型错误

Please Tell Me Why?

主程序全部代码

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()语句了
PHPz
PHPz

学习是最好的投资!

répondre à tous(3)
大家讲道理

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ée

with open('rent.csv','w') as csv_file:
    csv_writer = csv.writer(csv_file,delimiter=',')
    for house in house_list: # 在这里写csv
        #。。。。。。
        csv_writer.writerow([house_title, house_location, house_money, house_url])

Mettre à 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'

Ty80

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal