CSV 写入器自我覆盖

1 投票
3 回答
1932 浏览
提问于 2025-04-17 03:16

我正在尝试创建一个包含网址列表的CSV文件。

我对编程还很陌生,所以请原谅我代码写得不太好。

我有一个循环,它会遍历一个地方的列表,以获取网址列表。

然后在这个循环里面,我又有一个循环,用来把数据导出到CSV文件中。

import urllib, csv, re
from BeautifulSoup import BeautifulSoup
list_of_URLs = csv.reader(open("file_location_for_URLs_to_parse"))
for row in list_of_URLs:
    row_string = "".join(row)
    file = urllib.urlopen(row_string)
    page_HTML = file.read()
    soup = BeautifulSoup(page_HTML) # parsing HTML
    Thumbnail_image = soup.findAll("div", {"class": "remositorythumbnail"})
    Thumbnail_image_string = str(Thumbnail_image)
    soup_3 = BeautifulSoup(Thumbnail_image_string)
    Thumbnail_image_URL = soup_3.findAll('a', attrs={'href': re.compile("^http://")})

这部分对我来说不太好用:

    out  = csv.writer(open("file_location", "wb"), delimiter=";")
    for tag in soup_3.findAll('a', href=True):   
        out.writerow(tag['href'])

基本上,写入器总是覆盖之前的内容,有没有办法跳到CSV文件中第一个空行下面开始写入呢?

3 个回答

0

你现在对每个网址都调用一次 open("file_location", "wb"),这样会把之前对那个文件所做的所有操作都清空了。把这个调用移到你的 for 循环外面,这样就只会为所有网址打开一次文件。

5

不要把这个放在任何循环里面:

out  = csv.writer(open("file_location", "wb"), delimiter=";")

而是:

with open("file_location", "wb") as fout:
    out = csv.writer(fout, delimiter=";")
    # put for-loop here

注意事项:

  1. open("file_location", "wb") 这个命令会创建一个新文件,如果同名的旧文件存在,它会把旧文件覆盖掉。这就是为什么看起来像是写入者在覆盖旧的内容。
  2. 使用 with open(...) as ... 这个写法,因为它会在 with-block 结束时自动关闭文件。这样可以明确知道文件什么时候被关闭。否则,文件会一直保持打开状态(可能还没有完全写入)直到 out 被删除或者重新赋值。虽然这不是你主要的问题,但使用 with 真的很有用,所以值得提一下。
1

你每次写入文件后都有关闭文件吗?或者每次写入之前都有打开文件吗?先确认一下这个。
另外,试试用“ab”模式,而不是“wb”。“ab”模式会在文件末尾添加内容。

撰写回答