我有一个带有图片网址的csv文件,并在两列中提供了文件名。在文件中,一些文件名是重复的,但它们各自的链接是唯一的。我想保存所有图像。因此,如果 给定的filename.jpg图像存在我想将下一个图像保存为filename_2,filename_3。
我使用简单的urllib.urlretrieve行来获取图像
答案 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
适用于匹配是第一次出现_1
到file_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_names
和urls
。在循环内部,我们使用urllib.urlretrieve
下载图像。
for file_name, url in zip(new_file_names, urls):
urllib.urlretrieve(url, path + file_name)