【问题标题】:python - Download files and rename them based on csvpython - 下载文件并根据 csv 重命名它们
【发布时间】:2018-02-26 02:44:07
【问题描述】:

我有一个使用 Google 表格创建的 csv 文件。它有两列:A 列用于文件链接,B 列用于名称。我在网站上找到了这个代码来使用:

import csv
import urllib.request

with open('c:\\links.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='|')
    for row in reader:
        fileurl = row[0]
        filename = row[1]
urllib.request.urlretrieve(fileurl, "E:\\" + filename)`

但它只下载 csv 文件的最后一行。 我正在使用 Python 3,而且我是编码新手。

【问题讨论】:

  • 因为for 循环中没有您的urllib.requestfilename 将在循环采用许多不同的值,但您目前只能看到最后一个。

标签: python python-3.x csv urllib


【解决方案1】:

在循环的每次迭代中,您都会覆盖最后的赋值,因此在循环结束后,您会将最后一行放入变量中。

您可以在循环中检索url,并继续请求的逻辑,这样每一行都会请求相关的url。

在请求每个 url 后,我建议将其存储在一个列表中,这样循环结束后,您将在一个名为 res 的列表中获得所有结果

import csv
import urllib.request
res = []
with open('c:\\links.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='|')
    for row in reader:
        fileurl = row[0]
        filename = row[1]
        res.append(urllib.request.urlretrieve(fileurl, "E:\\" + filename))
        ...

【讨论】:

    【解决方案2】:

    这是因为 filename 和 fileurl 变量每次都会更新,当它们退出循环时,它们包含最后一行。要处理每一行,请在循环中添加最后一行。

    【讨论】:

    • 我不确定这如何为 10 分钟前已经留下的答案添加任何内容。
    【解决方案3】:

    将对urllib.request.ulrretrieve 的调用移动到循环中。我认为这将产生最接近您预期的效果。每次迭代时,fileurlfilename 变量都会更改以匹配 .csv 中的条目。

    import csv
    with open('c:\\links.csv') as csvfile:
        reader = csv.reader(csvfile, delimiter=',', quotechar='|')
        for row in reader:
            fileurl = row[0]
            filename = row[1]
            urllib.request.urlretrieve(fileurl, "E:\\" + filename)
    

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 2021-08-10
      • 1970-01-01
      • 2015-07-09
      • 2011-12-29
      • 2013-10-25
      相关资源
      最近更新 更多