繼續努力
tag on Python

為了把原設為 irclog/$tag/$0/%Y/$0.%Y%m%d.log 格式的 irssi log 改成 irclog/$tag/$0/%Y/$0.%Y%m.log (每月一個檔;之前每天放一個檔,感覺資料太難找了),寫了一個小程式把舊的 log 接合起來。

寫的時間稍微有點久,程式看起來也有點累贅;有沒有辦法在二三十行內解決呢?

以下是程式 listing:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""
$Id: irclogday2month.py 5 2006-03-21 13:08:39Z yungyuc $
"""

try:
    __revision__ = int( "$Revesion$".split()[1] )
except:
    __revision__ = 0

import sys

from os import makedirs
from os.path import exists, join, basename
from glob import glob

def main():
    sourcedir = "source"
    targetdir = "target"

    networks = [ basename(p) for p in glob(join( sourcedir, "*" )) ]
    for network in networks:
        channels = [ basename(p)
            for p in glob(join( sourcedir, network, "*" )) ]
        for channel in channels:
            years = [ basename(p)
                for p in glob(join( sourcedir, network, channel, "*" )) ]
            for year in years:
                # Actually do text-joining.
                #  Get day strings.
                days = [ basename(p)
                    for p in glob(join( sourcedir,
                        network, channel, year, "*.log" )) ]
                #  Create dictionary keyed by month name (string) containing
                #  day listing
                months = {}
                for day in days:
                    key = day[-8:-6]
                    month = months.get( key, [] )
                    month.append( day )
                    months[key] = month
                #  Write source text file jointly to target text file.
                for key in months:
                    month = months[key]
                    # Sort the day list.
                    month.sort()
                    # Data initially empty.
                    data = ""
                    #  Then joining all files in day list.
                    for day in month:
                        f = open(join(
                            sourcedir, network, channel, year, day ))
                        data += f.read()
                        f.close()
                    # Preparing target containing directory.
                    tdir = join( targetdir, network, channel, year )
                    if not exists( tdir ):
                        makedirs( tdir )
                    # Write to target text file.
                    tfile = "%s.%s%s.log" % (channel, year, key)
                    f = open(join( tdir, tfile ), 'w' )
                    f.write( data )
                    f.close()
                    sys.stdout.write( "%s is written.\n" % join( tdir, tfile ) )

if __name__ == '__main__':
    main()

# vim:set ai et nu sw=4 ts=4 tw=80:
Posted by yungyuc at 21:29, 0 comment, 0 trackback.
Navigate
Add a trackback
Add a comment

Your name. (required)

Your personal website. (optional)

Your email address. Will not show in page. (suggested, but optional)

Text format is "Plain Text".

Enter "glVQp"
© hover year to navigate month: powered by django