2012-04-16 44 views
1

多个文件,我想使用scrapy网络刮后,他们将文件保存到一个目录。我从文件中提取一个日期并将其用作文件名。但是,我遇到的问题是,某些文件具有相同的日期,即有两个文件名称为“2009年6月2日”。所以,我想要做的是以某种方式检查是否已经有一个相同名称的文件,如果是,请将其命名为“June 2,2009.1”或类似名称。命名Python和scrapy

我正在使用的代码如下:

def parse_item(self, response): 
    self.log('Hi, this is an item page! %s' % response.url) 

    response = response.replace(body=response.body.replace('<br />', '\n')) 

    hxs = HtmlXPathSelector(response) 

    date = hxs.select("//div[@id='content']").extract()[0] 
    dateStrip = re.search(r"([A-Z]*|[A-z][a-z]+)\s\d*\d,\s[0-9]+", date) 
    newDate = dateStrip.group() 


    content = hxs.select("//div[@id='content']") 
    content = content.select('string()').extract()[0] 

    filename = ("/path/to/a/folder/ %s.txt") % (newDate) 


    with codecs.open(filename, 'w', encoding='utf-8') as output: 
     output.write(content) 

回答

0

对方回答指出我在正确的方向通过检查进入蟒蛇操作系统的工具,但我想我找到了办法也许更简单。更多信息请参考How do I check whether a file exists using Python?

以下是我想出了代码:

existence = os.path.isfile(filename) 

    if existence == False: 
     with codecs.open(filename, 'w', encoding='utf-8') as output: 
      output.write(content) 
    else: 
     newFilename = ("/path/.../.../- " + '%s' ".1.txt") % (newDate) 
     with codecs.open(newFilename, 'w', encoding='utf-8') as output: 
      output.write(content) 

编辑补充:

我不喜欢这个解决方案太多,以为对方回答的解决方案是可能会更好,但没很不起作用。我不喜欢我的解决方案的主要部分是它只能处理2个同名文件;如果三个或四个文件具有相同的名称,则会出现最初的问题。以下是我想出了:

filename = ("/Users/path/" + " " + "title " + '%s' + " " + "-1.txt") % (date) 
filename = str(filename) 

    while True: 
     os.path.isfile(filename) 
     newName = filename.replace(".txt", "", filename) 
     newName = str.split(newName) 
     newName[-1] = str(int(newName[-1]) + 1) 
     filename = " ".join(newName) + ".txt" 
     if os.path.isfile(filename) == False: 
      with codecs.open(filename, 'w', encoding='utf-8') as output: 
       output.write(texts) 
      break 

它可能不是最优雅,最可能是种hackish的方式,但它迄今的工作,似乎已经解决了我的问题。

+0

这是好的,只要你的Python脚本是创建这些文件的唯一进程。如果你在并行与其他程序的工作有一个[微妙的竞争条件(http://stackoverflow.com/questions/82831/how-do-i-check-if-a-file-exists-using-python)你可能需要考虑。 – 2012-04-17 07:00:28

0

的常用方法来检查的C库文件的存在是一个叫做stat()功能。 Python以os.stat()的形式围绕此函数提供了一个薄包装。我建议你使用它。

http://docs.python.org/library/stat.html

def file_exists(fname): 
    try: 
     stat_info = os.stat(fname) 
     if os.S_ISREG(stat_info): # true for regular file 
      return True 
    except Exception: 
     pass 
    return False 
0

一个其他的解决办法是可以追加的时间与日期,命名文件中像

from datetime import datetime 

filename = ("/path/to/a/folder/ %s_%s.txt") % (newDate,datetime.now().strftime("%H%M%S")) 
1

您可以使用os.listdir获得现有文件的列表,并分配不会导致冲突的文件名。

import os 
def get_file_store_name(path, fname): 
    count = 0 
    for f in os.listdir(path): 
     if fname in f: 
      count += 1 
    return os.path.join(path, fname+str(count)) 

# This is example to use 
print get_file_store_name(".", "README")+".txt" 
+0

(1)考虑到所有的文件都是蜘蛛生成的(使用这个函数来分配名字),所以没有机会遇到混淆。你必须在完成和效率之间取得平衡。 (2)使用我的方法在B中检查A,使用你的方法在B的左边A中使用“f.endwith”在B的右边A中检查A,我的方法更普遍且效果更差,但很难说这是错误的。 – wuliang 2012-04-17 20:49:23

+0

重要的事情总是会返回相同的名字?它只是一个索引(后缀)到原始名称。假设您已下载名为README的文件,并调用此函数来获取新名称。该函数只是检查目录,如果目录已经有README0,README1,它会得到一个名称README2。 – wuliang 2012-04-18 07:54:01

+0

是的,你是对的,我会删除以前的评论,以及这一个在几个。我不熟悉“in”关键字来比较字符串。 – FabienAndre 2012-04-18 08:40:42