6

dateutil を使用して画像ファイル名を解析し、日付に従って並べ替えています。すべての写真にメタデータがあるわけではないため、dateutil はそれらをどこに配置するかを推測しようとしています。

私の写真のほとんどはこの形式です: 2007-09-10_0001.jpg 2007-09-10_0002.jpg など...

fileName = os.path.splitext(file)[0]
print("Guesssing date from ", fileName)
try:
    dateString = dateParser.parse(file, fuzzy=True)
    print("Guessed date", dateString)
    year=dateString.year
    month = dateString.month
    day=dateString.day
except ValueError:
    print("Unable to determine date of ", file)

私が得ているリターンはこれです:

('Guesssing date from ', '2007-09-10_00005')
('Unable to determine date of ', '2007-09-10_00005.jpg')

これで、アンダースコアの後ろからすべてを削除できるはずですが、別の形式の写真がある場合に備えて、可能であればより堅牢なソリューションが必要でした. 私はファジーが文字列内の任意の日付を見つけてそれに一致させようとしましたが、明らかに機能していません...

パーサーに日付のように見えるものを見つけさせ、その後停止させる簡単な方法はありますか? そうでない場合、パーサーにアンダースコアの後のすべてを無視させる最も簡単な方法は何ですか? または、無視セクションを使用して複数の日付形式を定義する方法。

ありがとう!

4

2 に答える 2

4

デコードできない限り、文字列を「縮小」することができます。

from dateutil import parser

def reduce_string(string):
    i = len(string) - 1
    while string[i] >= '0' and string[i] < '9':
        i -= 1
    while string[i] < '0' or string[i] > '9':
        i -= 1
    return string[:i + 1]

def find_date(string):
    while string:
        try:
            dateString = parser.parse(string, fuzzy=True)
            year = dateString.year
            month = dateString.month
            day = dateString.day
            return (year, month, day)
        except ValueError:
            pass

        string = reduce_string(string)

    return None

date = find_date('2007-09-10_00005')
if date:
    print date
else:
    print "can't decode"

アイデアは、パーサーが有効な日付にデコードできるようになるまで、文字列の末尾 (数値と非数値) を削除することです。

于 2013-06-09T17:14:08.973 に答える
3

この問題へのさらなる洞察として、ここで未来からコメントします。

dateutilのあいまい検索は、通常の自然言語で日付を取得するのにはかなり適していますが、上のような文字列では、数値/記号関連のノイズが大量に含まれているため失敗します。dateutilただし、より新しいバージョンの を実行すると、次のようになります。

>>> from dateutil.parser import parse
>>> parse('2007-09-10_00005.jpg', fuzzy=True)

parseで失敗しますがTypeError: 'NoneType' object is not iterable、これはあまり慣用的ではありません。

もう 1 つの方法は、正規表現を使用して既知の日付形式を探すことです。もちろん、これはユース ケースによって異なりますが、OP は、彼の日付は常に形式YYYY-MM-DDであると述べており、正規表現検索に最適です。

from dateutil.parser import parse
import re

date_pattern = re.compile('\d{4}-\d{2}-\d{2}')

def extract_date(filename):
    matches = re.match(date_pattern, filename)
    if matches:
        return parse(matches.group(0))
    else:
        return None

extract_date('2007-09-10_00005.jpg')  # datetime.datetime(2007, 9, 10, 0, 0)
于 2014-08-21T09:59:52.860 に答える