0

首先:对不起我可怜的英语语言技能。其次:我已经学习python几个星期了,所以请耐心等待。:)

我的项目:我有一个包含多个文件(xml)的目录。

they looks like:    
            thingy1_442354565666.xml
            thingy2_502354565666.xml
            thingy3_692354565666.xml
            etc.

文件名中的数字代表文件的最后修改日期。较大的数字表示最近的文件。(这将在以后很重要。)

每个 xml 包含两个元素。

for example:
        <period>012012</period>     # this represent months
        <charges>1098</charges>     # EUR

问题:我需要每个月的输出 txt。

like this:  
        jan: 1098
        feb: 499
        etc.

不幸的是,我在那个目录中有超过 12 个 xml,所以我每个月都有 2-3 个文件(我总是需要最后修改的文件)。

我试图用文件名和句点元素制作一个字典,但我完全迷路了。顺便说一句,我可以用 elementtree 等解析 xml,但我不知道如何选择每个月最后修改的文件。

请帮助我,并询问我是否无法理解。谢谢!

4

1 回答 1

0

如果较大的数字意味着较旧的文件,请对文件列表进行排序并从最小到最大迭代文件(即首先是最新文件)。

解析 xml 并跟踪(year, month)您看到的对。如果您已经看过一对,那么您已经处理了该月的最新文件,您可以忽略后续文件。

就像是:

import glob
from datetime import datetime
from lxml import etree

def file_timestamp(filepath):
    """Return the timestamp from a file name"""
    filename = os.path.split(filepath)[1]
    filename = os.path.splitext(filename)[0]
    if '_' in filename:
        return filename.split('_')[1]
    return None

class Datafiles(object):
    def __init__(self, dir_path):
        self.date_cache = {}
        self.dir_path = dir_path

    def __iter__(self):
        return self.files()

    def next(self):
        return self.files().next()

    def files(self):
        filepaths = glob.glob(self.dir_path + '*_*.xml')
        filepaths = sorted(filepaths, key=file_timestamp)

        for filepath in filepaths:
            ## Parse data (xml)
            data = self.parse_file(filepath)
            ## If year/month is seen before, skip
            date = datetime.strptime(data['period'].text, '%m%Y')
            month = (date.year, date.month)
            if month in self.date_cache:
                continue

            ## Else store date and yield
            self.date_cache[month] = filepath
            yield data

    def parse_file(self, filepath):
        # YOUR XML PARSING HERE
        return etree.parse(filepath)

用法:

>>> files = Datafiles(data_directory)
>>> for xml_data in files:
...     ## do something with the data
于 2012-04-27T09:05:13.860 回答