首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

怎么生成唯一的文件名

2013-07-04 
如何生成唯一的文件名之前用python(urllib2+beautifulsoup)写了一个爬虫,爬取一些图片和相关的文本。一共12

如何生成唯一的文件名
之前用python(urllib2+beautifulsoup)写了一个爬虫,爬取一些图片和相关的文本。一共12类图像,每一类使用一个线程下载。

我使用一个列表url_list保存已经下载过的图片的链接,后面在遇到链接的时候判断是否存在列表url_list中,如果存在就不再下载。我使用url_list的长度对图像和它对应的文本命名。然后写入文件,如果写入过程没有发生异常,那么就把图片的链接加入url_list中。过程大致如下:

1.根据url_list长度生成文件名
2.写入文件
3.将图片链接加入url_list

但是在多线程下有可能出现重复的文件名,比如类A完成了第一步进入第二步(进入第三步之前),此时,类B也进入第一步,那么A还没有将链接加入url_list,url_list的长度还没有发生变化,那么类B就生成了重复的文件名。

我的代码大致如下:


#根据列表生成文件名,url_list_rlock是锁
 url_list_rlock.acquire()
 text_file_name = str(len(image_url_list))+'.txt'
 image_file_name = str(len(image_url_list))+'.jpg'
 url_list_rlock.release()
 
#写入文件,省略

#下面把链接加入列表
 url_list_rlock.acquire()
image_url_list.append(image_url)
url_list_rlock.release()


我想我可以用锁把上面全部作为临界区,但是这样会不会太慢了。
我使用列表长度作为文件名是因为这样比较直观。请问大家又什么好的建议没有,怎么避免重复的文件名
多谢了!
[解决办法]
1.url 本身就是唯一的,要充分利用这点
2.可以建立临时列表,如果失败就去除,最后才写入list,然后回溯一次检查
3.网络状况不可预料,爬虫要两次或多次抓取是经常的事
[解决办法]
不要在列表中判断,如果图片不是很大的画,下载很快的.
每个线程都去判断指定的文件(真的那个文件,不是列表中的文件名)是否存在即可

>>> import os
>>> os.path.isfile(r'no_file.py')
False

[解决办法]
LZ可以考虑用uuid作为文件名的组成部分。
[解决办法]
专门建一个负责“发号”的线程,其他下载线程成功下载一个文件后,向“发号机”线程申请一个序列号。这样,需要同步的部分只有一个非常简单的函数:增加counter,返回counter。

热点排行