【问题标题】:csv.writer Append a csv file with new data onlycsv.writer 附加一个仅包含新数据的 csv 文件
【发布时间】:2017-05-03 19:01:11
【问题描述】:

我有一个脚本,用于从网站上抓取数据并将其存储到电子表格中

with open("c:\source\list.csv") as f:
  for row in csv.reader(f):
    for url in row:
      r = requests.get(url)
      soup = BeautifulSoup(r.content, 'lxml')
      tables = soup.find('table', attrs={"class": "hpui-standardHrGrid-table"})
          for rows in tables.find_all('tr', {'releasetype': 'Current_Releases'})[0::1]:
        item = []
        for val in rows.find_all('td'):
          item.append(val.text.strip())
      with open('c:\output_file.csv', 'a', newline='') as f:
        writer = csv.writer(f)
        writer.writerow({url})
        writer.writerows(item)

截至目前,当此脚本运行时,CSV 文件底部会添加大约 50 条新行(完全预期与 append 函数一起使用),但我希望它做的是确定是否有重复的条目在 CSV 文件中并跳过它们,然后更改不匹配项。

我觉得这应该是可能的,但我似乎想不出办法

有什么想法吗?

【问题讨论】:

  • 不要通过将问题替换为问题的答案来“修复”您的问题。作为一个问题不再有意义,所以我恢复了旧版本。如果您确信您自己的解决方案会为您给出的答案添加一些内容(在这种情况下,您不应该这样做),然后为您自己的问题创建一个答案,解释您是如何解决问题的。但是问题是;编辑是为了澄清问题,而不是让它消失。

标签: python python-3.x csv


【解决方案1】:

如果不从 CSV 文件中读取数据,您将无法做到这一点。同样为了“改变不匹配”,你只需要重写它们。

f = open('c:\output_file.csv', 'w', newline='')
writer = csv.writer(f)

for item in list_to_write_from:
    writer.writerow(item)

在这里,您假设list_to_write_from 将包含您需要的最新形式的数据。

【讨论】:

  • 要“更改不匹配”,唯一明智的方法是清除 CSV 并重新写入。
  • 是的,很遗憾。
  • Glargh... 将 'a' 更改为 'w' 的问题是,在我的循环中,它导致它只写 1 行文本而不是 30... 我会尝试使用你的 if not 循环,看看这是否符合我的需要。谢谢!
  • 那是因为您每次要写入一行时都打开文件,所以它会覆盖之前写入的任何内容。要解决这个问题,请尝试我编辑的代码。
  • @KevinJohnson 我更喜欢使用“她” :) 什么没用?您正在“附加”到一个新文件,这与在文件存在时覆盖所有内容或创建新文件相同。使用写入模式隐式执行此检查。
【解决方案2】:

我找到了解决此问题的方法,因为提供的答案对我不起作用

我补充说:

if os.path.isfile("c:\source\output_file.csv"):
    os.remove("c:\source\output_file.csv")

到我的代码顶部,因为这将检查该文件是否存在,然后将其删除,只是稍后使用最新信息重新创建它。这是一种管道胶带的做事方式,但它确实有效。

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2021-04-16
    • 2021-12-16
    • 2019-08-01
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多