1

在使用scrapy从网络上抓取文件后,我正在尝试将文件保存到目录中。我正在从文件中提取日期并将其用作文件名。然而,我遇到的问题是某些文件具有相同的日期,即有两个文件的名称为“2009 年 6 月 2 日”。所以,我想做的是以某种方式检查是否已经有一个同名的文件,如果有,请将其命名为“June 2, 2009.1”之类的名称。

我正在使用的代码如下:

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)
4

4 回答 4

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"
于 2012-04-17T11:01:04.780 回答
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
于 2012-04-16T03:13:41.370 回答
0

另一个答案通过检查python中的os工具为我指明了正确的方向,但我认为我找到的方式可能更直接。参考这里如何使用 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

它可能不是最优雅的,并且可能是一种骇人听闻的方法,但到目前为止它已经奏效并且似乎已经解决了我的问题。

于 2012-04-16T13:30:27.690 回答
0

另一种解决方案是您可以在日期后附加时间,用于命名文件,例如

from datetime import datetime

filename = ("/path/to/a/folder/ %s_%s.txt") % (newDate,datetime.now().strftime("%H%M%S")) 
于 2012-04-17T06:55:34.113 回答