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

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

学习是最好的投资!

reply all(3)
大家讲道理

After reading it briefly, there are many questions~

#csv_file = open("rent.csv","wb") # This sentence is deleted and repeated

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

Update a little

csv is a text format file and does not support binary writing, so do not open the file in binary mode, and the data does not need to be converted into bytes.

Update again

根本原因是楼主看错文档,导致了理解有误~

迷茫

Open parameter 'wb' changed to 'w'

Ty80

The real reason why python2.x needs to write in ‘wb’ mode

When writing CSV in python2.x, the 'b' parameter must be added to the creation of the CSV file, that is, csv.writer(open('test.csv','wb')), otherwise interlaced lines will occur. The explanation found on the Internet is: when Python writes a file normally, 'n' is added to the end of each line by default, which is 0x0D, and the end of the writerow command will add another 0x0D0A, so for Windows systems, it is two lines. When using the 'b' parameter to write files in binary, the system default is not to add 0x0D

In python3.x, the parameter newline='' is used to achieve this purpose

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template