避免使用urllib来替换文件,但是给它一个_1,_2之类的名字

时间:2018-01-24 17:12:42

标签: python-2.7 urllib

我有一个带有图片网址的csv文件,并在两列中提供了文件名。在文件中,一些文件名是重复的,但它们各自的链接是唯一的。我想保存所有图像。因此,如果 给定的filename.jpg图像存在我想将下一个图像保存为filename_2,filename_3。

我使用简单的urllib.urlretrieve行来获取图像

1 个答案:

答案 0 :(得分:2)

导入:

import csv
import os
import re
import urllib

首先,存储您的csv数据。

file_names = []
urls = []

with open('data.csv', 'r') as file:
    reader = csv.reader(file)
    for file_name, url in reader:
        file_names.append(file_name)
        urls.append(url)

    file.close()

创建一个新列表以存储新文件名。

new_file_names = []

遍历file_names列表。

for file_name in file_names:

抓住文件扩展名。有许多图片扩展程序: .jpg .png 等。

  

这假设文件扩展名只有4个字符长,包括.只要您在整个文档中看到[-4:],请注意这一点。如果是一个问题,请使用正则表达式来获取文件扩展名。

    file_ext = file_name[-4:]

接下来遍历new_file_names列表,看看我们是否从file_name列表中抓取了file_names的所有匹配项。

    for temp_file_name in new_file_names:
        if temp_file_name == file_name:

当我们得到匹配项时,请先检查它是否已有'_\b+' + file_ext。这意味着_ + any numbers + file_ext

            check = re.search('_\d+' + file_ext, temp_file_name)

如果支票为True,我们现在想查看该号码是什么,并添加一个。

            if check:
                number = int(check.group(0)[1:-4]) + 1

现在我们想要像以前一样做相反的正则表达式,所以我们只得到文件名+ _但没有所有数字。然后添加新号码和file_ext

                inverse = re.search('.*_(?=\d+' + file_ext + ')', file_name)
                file_name = inverse.group(0) + str(number) + file_ext

else适用于匹配是第一次出现_1file_name的结尾时。

            else:
                file_name = file_name[:-4] + '_1' + file_ext

file_name附加到new_file_names列表。

    new_file_names.append(file_name)

设置文件夹(如果需要)以存储图像。如果该文件夹不存在,它将为您创建一个文件夹。

path = 'img/'

try:
    os.makedirs(path)
except OSError:
    if not os.path.isdir(path):
        raise

最后,为了保存图片,我们使用for循环并压缩new_file_namesurls。在循环内部,我们使用urllib.urlretrieve下载图像。

for file_name, url in zip(new_file_names, urls):
    urllib.urlretrieve(url, path + file_name)