【问题标题】:Download web images by URL from excel and save to folders in Python通过 URL 从 excel 下载 Web 图像并保存到 Python 中的文件夹
【发布时间】:2019-10-31 20:38:46
【问题描述】:

我有一个excel文件如下:

import pandas as pd
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
pd.options.display.max_colwidth

df = pd.read_excel("./test.xlsx")
print(df)

输出:

  city buildingName  buildingID  imgType                 imgUrl
0   bj     LG tower      123456   inside  http://pic3.nipic.com/20090629/827780_144001014_2.jpg
1   bj     LG tower      123456  outside  http://pic.baike.soso.com/p/20140321/20140321160157-391052318.jpg
2   sh          LXD      123457   inside  http://pic10.nipic.com/20101008/2634566_104534032717_2.jpg
3   gz           GM      123458   inside  http://pic1.to8to.com/case/day_120720/20120720_fb680a57416b8d16bad2kO1kOUIzkNxO.jpg

我需要通过读取和迭代列imgUrl来下载图像并将图像保存到由列city, buildingName, buildingId, imgType.组合的路径中

最终的输出文件夹和子文件夹的结构是这样的,它们会保存在一个名为output的文件夹中:

├── bj
│   └── LG tower_123456
│       ├── inside
│       │   └── 827780_144001014_2.jpg
│       └── outside
│           └── 20140321160157-391052318.jpg
├── gz
│   └── GM_123458
│       └── inside
│           └── 2634566_104534032717_2.jpg
├── sh
│   └── LXD_123457
│       └── inside
│           └── 20120720_fb680a57416b8d16bad2kO1kOUIzkNxO.jpg

如何在 Python 中做到这一点?提前感谢您的帮助。

我已尝试下载一张图片:

import requests

r = requests.get("http://pic1.to8to.com/case/day_120720/20120720_fb680a57416b8d16bad2kO1kOUIzkNxO.jpg")
if r.status_code == 200:
    with open("test.jpg", "wb") as f:
        f.write(r.content)

【问题讨论】:

  • 这里有很多事情要做,我先看看pandasos 模块的文档。 os.mkdir() 例如可以创建一个目录。可以通过多种方式迭代 pandas 数据框列,然后您可以创建一个循环来迭代数据框,创建目录并从 URL 保存图像。这也可能有帮助:pandas.pydata.org/pandas-docs/stable/getting_started/10min.html

标签: python pandas loops operating-system


【解决方案1】:

假设您已加载数据框,您可以执行类似的操作。

    import requests
    from os.path import join
    for index, row in df.iterrows():
        url = row['url']
        file_name = url.split('/')[-1]
        r = requests.get(url)
        abs_file_name = join(row['city'],row['buildingName']+str(row['buildingId']),row['imgType'],file_name)
        if r.status_code == 200:
            with open(abs_file_name, "wb") as f:
                f.write(r.content)

修改后的代码:

    import requests
    from os.path import join,expanduser
    import os

    home = expanduser("~")
    df = pd.DataFrame()
    # df.append({})
    for index, row in df.iterrows():
        url = row['url']
        file_name = url.split('/')[-1]
        r = requests.get(url)
        filepath = join(home,row['city'],row['buildingName']+str(row['buildingId']),row['imgType'])
        if not os.path.exists(filepath):
            os.makedirs(filepath)
        filepath = join(filepath, file_name)
        # print(filepath)
        if r.status_code == 200:
            with open(filepath, "wb") as f:
                f.write(r.content)

【讨论】:

  • 谢谢,我收到一个错误FileNotFoundError: [Errno 2] No such file or directory: 'bj/LG tower_123456/inside/827780_144001014_2.jpg'
【解决方案2】:
import pandas as pd
import requests


def download_urls(csv_path):
    df = pd.read_csv(csv_path,encoding='utf-8',error_bad_lines=False)
    for index, row in df.iterrows():
        folder  = row[0]
        sub_folder = row[1]
        url = row[3]
        r = requests.get(url)
        if r.status_code == 200:
            with open("/{0}/{1}/{2}".format(folder, sub_folder, url.split("/")[-1]), "wb") as f:
                f.write(r.content)

path = r"C:\path\your_csv_path"
download_urls(path)

假设你有 csv 文件作为输入试试这个,没有用 pandas 迭代行的优雅方法,所以你可以使用 csv 库来代替

【讨论】:

  • 谢谢,但得到与@arajshree 的解决方案相同的错误:FileNotFoundError: [Errno 2] No such file or directory: '/bj/LG tower/827780_144001014_2.jpg'。也许我需要将columns 组合在一起并使用subproceeos 先创建目录?
【解决方案3】:
import pandas as pd
import requests
import os

def download_urls(csv_path):
    df = pd.read_csv(csv_path,encoding='utf-8',error_bad_lines=False)
    for index, row in df.iterrows():
        folder  = row[0]
        sub_folder = row[1]
        url = row[3]
        r = requests.get(url)
        if r.status_code == 200:
            if not os.path.exists(folder):
                os.makedirs(folder)
                if not os.path.exists(sub_folder):
                    os.makedirs(sub_folder)

            with open("/{0}/{1}/{2}".format(folder, sub_folder, url.split("/")[-1]), "wb") as f:
                f.write(r.content)

path = r"C:\path\your_csv_path"
download_urls(path)

如果不存在打开文件夹试试这个(将打开目录首先只运行)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2021-01-07
    • 2015-11-04
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多