writer = csv.DictWriter(file, fieldnames=reader.fieldnames)
在上述代码中,csv.DictWriter
被用于创建一个写入CSV文件的对象。DictWriter
是csv
模块提供的一个类,用于写入字典类型数据到CSV文件中。
在创建DictWriter
对象时,需要传入两个参数:文件对象和字段名。其中,文件对象是通过open
函数打开CSV文件后得到的。字段名可以通过读取器对象的fieldnames
属性获得,该属性返回CSV文件的标题行中的字段名。
具体代码如下所示:
writer = csv.DictWriter(file, fieldnames=reader.fieldnames)
在这个示例中,writer
是一个DictWriter
对象,它可以将字典数据写入到CSV文件中。fieldnames
参数使用了读取器对象reader
的fieldnames
属性,保证了写入的CSV文件保持与原始文件相同的字段顺序。
接下来,您可以使用writer.writeheader()
方法写入CSV文件的标题行,然后使用writer.writerows(rows)
方法将修改后的行数据写入CSV文件。
总结一下,通过将读取器对象的字段名作为参数传递给写入器对象,我们可以确保在写入CSV文件时保持相同的字段顺序。这样可以避免在修改用户信息时导致字段顺序混乱。
# 读取 CSV 文件 data1 = [] with open('day01改改.csv', 'r') as file: reader = csv.DictReader(file) for row in reader: data1.append(row) for row in data1: if row['duration'] <=0: data1.append(row) break fieldnames = data1[0].keys() # 获取字段名 with open('day01改改.csv', 'w', newline='') as result_file: writer = csv.DictWriter(result_file, fieldnames=fieldnames) writer.writeheader() # 写入字段名 writer.writerows(data1) TypeError: '<=' not supported between instances of 'str' and 'int'
在你的代码中,出现了一个TypeError错误,错误信息“'str' 和 'int' 之间不支持 '<=' 操作”。
这个错误是因为你尝试将字符串类型的row['duration']
与整数类型的0进行比较。在对CSV文件进行读取时,所有的列数据都会默认以字符串类型读取。所以,你需要将row['duration']
转换为整数类型后再进行比较。
你可以尝试修改以下代码来解决这个问题:
import csv
# 读取 CSV 文件
data1 = []
with open('day01改改.csv', 'r') as file:
reader = csv.DictReader(file)
for row in reader:
data1.append(row)
# 创建一个新的列表来存储更新后的数据
updated_data = []
# 遍历数据,筛选出符合条件的行
for row in data1:
if int(row['duration']) > 0:
updated_data.append(row)
fieldnames = data1[0].keys() # 获取字段名
with open('day01改改.csv', 'w', newline='') as result_file:
writer = csv.DictWriter(result_file, fieldnames=fieldnames)
writer.writeheader() # 写入字段名
writer.writerows(updated_data)
在这个示例中,我们将row['duration']
转换为整数类型进行比较,使用int(row['duration'])
。然后,我们创建一个新的列表updated_data
来存储符合条件的行。最后,我们将更新后的数据写入原始的CSV文件。
请注意,在这个示例中,我们使用了一个新的列表updated_data
来存储更新后的数据,而不是直接在原始的data1
列表上进行修改。这样可以避免在遍历列表时修改列表的长度导致问题。
import time import csv import pandas as pd from selenium import webdriver from selenium.webdriver import Chrome,ChromeOptions from selenium.webdriver.common.by import By # driver_path = r'C:\Program Files\Google\Chrome\Application\chrome.exe' driver = webdriver.Chrome() driver.get('https://www.jd.com/') def drop_down(): for x in range(1,9,2): time.sleep(1) j = x /9 js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j driver.execute_script(js) driver.find_element(By.CSS_SELECTOR,'#key').send_keys('燕麦') driver.find_element(By.CSS_SELECTOR,'.button').click() f = open(f'B:\京东商品数据.csv', mode='a', encoding='gbk', newline='') csv_writer = csv.DictWriter(f, fieldnames=[ '商品标题', '商品价格', '店铺名字', '标签', '商品详情页', ]) csv_writer.writeheader() 商品信息 = [] def get_shop(): time.sleep(10) # driver.implicitly_wait(10) drop_down() lis = driver.find_elements(By.CSS_SELECTOR,'#J_goodsList ul li') for li in lis: title = li.find_element(By.CSS_SELECTOR,'.p-name em').text.replace('\n', '') price = li.find_element(By.CSS_SELECTOR,'.p-price strong i').text shop_name = li.find_element(By.CSS_SELECTOR,'.J_im_icon a').text href = li.find_element(By.CSS_SELECTOR,'.p-img a').get_attribute('href') icons = li.find_elements(By.CSS_SELECTOR,'.p-icons i') icon = ','.join([i.text for i in icons]) dit = { '商品标题':title, '商品价格':price, '店铺名字':shop_name, '标签':icon, '商品详情页':href, } csv_writer.writerow(dit) # print(title,price,href,icon,sep=' | ') for page in range(1,3): time.sleep(1) drop_down() get_shop() driver.find_element(By.CSS_SELECTOR,'.pn-next').click() driver.quit() # data = csv.reader(open('B:\京东商品数据.csv'),delimiter=',') # sortedl = sorted(data,key=lambda x:(x[0],x[1]),reverse=True) # print('最贵的商品信息') # print(sortedl) # with open('B:\京东商品数据.csv','r',encoding='gbk') as f: # f_csv = csv.reader(f) # max_price = 0 # next(f_csv) # for row in f_csv: # if row[1].isdigit() and int(row[1]) > max_price: # max_price = int(row[1]) # print(max_price) with open('B:\京东商品数据.csv', 'r') as file: reader = csv.reader(file) header =next(reader) next(reader) max_price = float('-inf') for row in reader: num = float(row[1]) if num > max_price: max_price = num item = row[0] name_0= row[2] print(item,max_price,name_0)程序中出现ValueError: could not convert string to float: '商品价格'解决方法
在这个程序中,您使用了csv模块来读取和写入CSV文件,但是当您尝试将字符串转换为浮点数时出现了ValueError。这是因为您尝试将一个非数字字符串('商品价格')转换为float类型。
要解决这个问题,您需要在读取文件之前跳过CSV文件的第一行(即标题行),该行包含列名。可以使用csv.reader()函数的next()方法来跳过标题行,例如:
with open('B:\京东商品数据.csv', 'r') as file:
reader = csv.reader(file)
header = next(reader) # 跳过标题行
max_price = float('-inf')
for row in reader:
num = float(row[1])
if num > max_price:
max_price = num
item = row[0]
name_0= row[2]
print(item, max_price, name_0)
注意,这里使用float('-inf')来初始化max_price,以确保第一个价格将始终大于它。还要注意,您需要在for循环中保存商品名称和店铺名称,以便在找到最大价格时打印它们。