在 Python 中同时写入 CSV 并附加到列表的最佳方式
Best way to write to CSV and append to list simulatenously in Python
背景:
我有以下代码使用 Selenium 从这个 Simply Recipe Index URL 中找到 link 的列表并存储他们在 linklist
列表中。然后代码遍历 linklist
并且对于每个 link,它将下载食谱文本,然后将数据存储在 recipe_list
中
from bs4 import BeautifulSoup
import requests
from splinter import Browser
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import selenium
import time
import csv
#set up chromedriver for WINDOWS
driver=webdriver.Chrome('chromedriver.exe')
url = "https://www.simplyrecipes.com/index/"
driver.get(url)
response=requests.get(url)
soup=BeautifulSoup(response.text,'html.parser')
#set up chromedriver for MAC
driver=webdriver.Chrome("/Users/williamforsyth/Documents/uc_davis/Homework_Repos/group-project-2/Kathryn/chromedriver")
url = "https://www.simplyrecipes.com/index/"
driver.get(url)
response=requests.get(url)
soup=BeautifulSoup(response.text,'html.parser')
linklist=[]
links=soup.find_all('a')
for link in links:
linklist.append(link)
linklist_text=[]
for i in range(164,1068):
linklist_text.append(linklist[i].text)
recipe_list=[]
for link in linklist_text:
time.sleep(0.3)
target=driver.find_element_by_partial_link_text(link)
target.click()
time.sleep(0.1)
cards = driver.find_elements_by_class_name("grd-title-link")
for i in range(0,len(cards)):
try:
newcards = driver.find_elements_by_class_name("grd-title-link")
time.sleep(0.3)
newcards[i].click()
time.sleep(0.3)
recipe=driver.find_element_by_id("sr-recipe-callout")
recipe_list.append(recipe.text)
driver.back()
time.sleep(0.3)
except:
continue
driver.get(url)
问题:
编写这段代码时并没有考虑到我现在想要实现的功能,我想实现的是将每个循环中的 recipe.text
附加到 csv 文件。这是我想尝试附加到 CSV 的代码以及代码现在所做的,它附加到 recipe_list
recipe_list.append(recipe.text)
是否有一种简单的方法可以实现这一点,而无需重新编写整个代码?
编写包含单列食谱文本的 CSV 的一种简单方法是在编写 recipe_list
后使用 csv 模块:
import csv
with open('recipies.csv', mode='w', newline='') as fileobj:
csv.writer(fileobj).writerows([col] for col in recipe_list)
这将在您每次 运行 时覆盖 recipies 文件。您可以使用 mode='a'
来追加。
您想“..将每个循环中的 recipe.text 附加到 csv 文件”
如果你只是想将它转储到你的 TRY 循环的每次迭代的文件中,那么你可以导入一个 reader 并用一些东西替换你的“recipe_list.append(recipe.text)”喜欢:
import csv
with open('recipe_output.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter=',')
writer.writerow(recipe.text)
在循环开始之前的某处设置“with open()”和“writer =”行,并使用此“writer.writerow”行替换当前的“recipe_list.append(recipe.text)”行。这将为您提供每个循环的文件转储到 CSV 文件中,而不是从末尾的附加列表中转储很多
背景:
我有以下代码使用 Selenium 从这个 Simply Recipe Index URL 中找到 link 的列表并存储他们在 linklist
列表中。然后代码遍历 linklist
并且对于每个 link,它将下载食谱文本,然后将数据存储在 recipe_list
from bs4 import BeautifulSoup
import requests
from splinter import Browser
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import selenium
import time
import csv
#set up chromedriver for WINDOWS
driver=webdriver.Chrome('chromedriver.exe')
url = "https://www.simplyrecipes.com/index/"
driver.get(url)
response=requests.get(url)
soup=BeautifulSoup(response.text,'html.parser')
#set up chromedriver for MAC
driver=webdriver.Chrome("/Users/williamforsyth/Documents/uc_davis/Homework_Repos/group-project-2/Kathryn/chromedriver")
url = "https://www.simplyrecipes.com/index/"
driver.get(url)
response=requests.get(url)
soup=BeautifulSoup(response.text,'html.parser')
linklist=[]
links=soup.find_all('a')
for link in links:
linklist.append(link)
linklist_text=[]
for i in range(164,1068):
linklist_text.append(linklist[i].text)
recipe_list=[]
for link in linklist_text:
time.sleep(0.3)
target=driver.find_element_by_partial_link_text(link)
target.click()
time.sleep(0.1)
cards = driver.find_elements_by_class_name("grd-title-link")
for i in range(0,len(cards)):
try:
newcards = driver.find_elements_by_class_name("grd-title-link")
time.sleep(0.3)
newcards[i].click()
time.sleep(0.3)
recipe=driver.find_element_by_id("sr-recipe-callout")
recipe_list.append(recipe.text)
driver.back()
time.sleep(0.3)
except:
continue
driver.get(url)
问题:
编写这段代码时并没有考虑到我现在想要实现的功能,我想实现的是将每个循环中的 recipe.text
附加到 csv 文件。这是我想尝试附加到 CSV 的代码以及代码现在所做的,它附加到 recipe_list
recipe_list.append(recipe.text)
是否有一种简单的方法可以实现这一点,而无需重新编写整个代码?
编写包含单列食谱文本的 CSV 的一种简单方法是在编写 recipe_list
后使用 csv 模块:
import csv
with open('recipies.csv', mode='w', newline='') as fileobj:
csv.writer(fileobj).writerows([col] for col in recipe_list)
这将在您每次 运行 时覆盖 recipies 文件。您可以使用 mode='a'
来追加。
您想“..将每个循环中的 recipe.text 附加到 csv 文件”
如果你只是想将它转储到你的 TRY 循环的每次迭代的文件中,那么你可以导入一个 reader 并用一些东西替换你的“recipe_list.append(recipe.text)”喜欢:
import csv
with open('recipe_output.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter=',')
writer.writerow(recipe.text)
在循环开始之前的某处设置“with open()”和“writer =”行,并使用此“writer.writerow”行替换当前的“recipe_list.append(recipe.text)”行。这将为您提供每个循环的文件转储到 CSV 文件中,而不是从末尾的附加列表中转储很多