在 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 文件中,而不是从末尾的附加列表中转储很多