Python - 将 For Loop 项目作为新行写入 CSV
Posted
技术标签:
【中文标题】Python - 将 For Loop 项目作为新行写入 CSV【英文标题】:Python - Write For Loop items into CSV as new rows 【发布时间】:2021-09-11 15:49:55 【问题描述】:您好,我一直在使用 python 脚本来收集结果列表并将这些结果写入 csv 文件。
我的代码有效,但它会将结果写入一个单元格(由“~”连接)。我想将每个结果写入一个新行。
我没有太多经验,但我确实在我的能力范围内进行了搜索。如果您觉得好像有什么东西在躲避我,请告诉我我应该一直在寻找什么吗?
这是我当前的代码:
person_result_names = WebDriverWait(browser, 60, ignored_exceptions=ignored_exceptions).until(EC.visibility_of_element_located((By.ID, 'person_results'))).find_elements_by_css_selector("#person_info > div > div > div.name.variation")
wait_time(1)
all_persons = [ person.text.replace(',', '').replace('\n', ' ') for person in person_result_names ]
print(f"[**] Found len(all_persons) people")
person = '~'.join(all_persons)
print(person)
report_links = browser.find_elements_by_css_selector('#person_results > div > a')
all_urls = [ url.get_attribute('href') for url in report_links ]
print(f"[**] Found len(all_urls) report urls")
url = '~'.join(all_urls)
print(url)
time.sleep(5)
with open('3_results-output.csv', 'a') as fp:
print(f"row_id,person,url", file=fp)
不用担心最后一行的row_id
变量。它是从另一个来源拉出来的。提前感谢所有有用的解决方案。
这是我当前的输出:
ID
表示每个搜索查询,因此ID 0
对于名称和网址都有 3 个结果。 ID 1
每个有 4 个结果
ID | Names | Urls
0 | John Doe~Joe Doe~Jay Doe | http://www.link.com/1~http://www.link.com/2~http://www.link.com/3
1 | Jane Doe~Janet Doe~Jill Doe~Julia Doe | http://www.link.com/4~http://www.link.com/5~http://www.link.com/6~http://www.link.com/7
这是我希望输出的样子:
ID | Names | Urls
0 | John Doe | http://www.link.com/1
0 | Joe Doe | http://www.link.com/2
0 | Jay Doe | http://www.link.com/3
1 | Jane Doe | http://www.link.com/4
1 | Janet Doe | http://www.link.com/5
1 | Jill Doe | http://www.link.com/6
1 | Julia Doe | http://www.link.com/7
更新
这是最终为我工作的代码。感谢@Tim Post 为我指明了正确的方向。我只需要包含所有结果的写作方法。下面的代码对我有用:
person_result_names = WebDriverWait(browser, 60, ignored_exceptions=ignored_exceptions).until(EC.visibility_of_element_located((By.ID, 'person_results'))).find_elements_by_css_selector("#person_info > div > div > div.name.variation")
wait_time(1)
print("\tScraping People\n")
all_persons = [ person.text.replace(',', '').replace('\n', ' ') for person in person_result_names ]
print(f"[**] Found len(all_persons) people")
wait_time(1)
report_links = browser.find_elements_by_css_selector('#person_results > div > a')
all_urls = [ url.get_attribute('href') for url in report_links ]
print(f"[**] Found len(all_urls) report urls")
with open('3_results-output.csv', 'a') as fp:
for person, url in zip(all_persons, all_urls):
print(f"row_id,person,url", file=fp)
【问题讨论】:
您好!欢迎来到本站。我已经修改了与您的经验水平相关的答案中的措辞,因此它指出了有用的人可以根据需要做的事情。另外,我从其他人那里删除了很多居高临下的 cmets - 很抱歉您经历过这种情况,这不是我们。 @TimPost 谢谢。我将继续使用这种方法。非常感谢:) 【参考方案1】:尝试以下方法。它利用 Python 的 CSV 库来帮助将行写入文件:
import csv
person_result_names = WebDriverWait(browser, 60, ignored_exceptions=ignored_exceptions).until(EC.visibility_of_element_located((By.ID, 'person_results'))).find_elements_by_css_selector("#person_info > div > div > div.name.variation")
wait_time(1)
all_persons = [person.text.replace(',', '').replace('\n', ' ') for person in person_result_names]
print(f"[**] Found len(all_persons) people")
report_links = browser.find_elements_by_css_selector('#person_results > div > a')
all_urls = [ url.get_attribute('href') for url in report_links ]
print(f"[**] Found len(all_urls) report urls")
with open('3_results-output.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(["ID", "Names", "Urls"]) # Write the header
row_id = 0
for person, url in zip(all_persons, all_urls):
csv_output.writerow([row_id, person, url])
显然,您需要在某处添加另一个循环来处理多个row_id
,但这至少说明了如何正确写入文件。它假定all_persons
和all_urls
的长度相等。
【讨论】:
嗨,马丁,非常感谢您就我遇到的这个问题提供的意见。您的解决方案记录了部分结果。出于测试目的,我给我的脚本输入了 3 个结果页面,我想从中收集数据。您提供的代码仅记录最后一个输入页面(#3)的结果,它不记录最后一行之前的页面(#1 和#2)的任何结果。您知道如何包括所有行而不仅仅是最后一行吗?我希望我能正确解释结果。如果您需要我提供更多详细信息,请告诉我。再次感谢!以上是关于Python - 将 For Loop 项目作为新行写入 CSV的主要内容,如果未能解决你的问题,请参考以下文章
我想将'for-loop'的结果保存为python中的文本文件
将 Python DataFrame 中的值更改为二进制标志(For-Loop 问题)