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

根本原因是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

学习是最好的投资!

membalas semua(3)
大家讲道理

Selepas membacanya secara ringkas, terdapat banyak persoalan~

#csv_file = open("rent.csv","wb") # Ayat ini dipadamkan dan diulang

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])

Kemas 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'

Ty80

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan