0

まず、私の哀れな英語のスキルについて申し訳ありません。第二に:私は数週間Pythonを学んだので、しばらくお待ちください。:)

私のプロジェクト:複数のファイル(xml)を含むディレクトリを取得しました。

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

ファイル名の数字は、ファイルの最終変更日を表します。数字が大きいほど、最近のファイルを意味します。(これは後で重要になります。)

各xmlには2つの要素が含まれています。

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

数値が大きいほど古いファイルを意味する場合は、ファイルリストを並べ替えて、ファイルを小さいものから大きいものへと繰り返します(つまり、最新のファイルが最初になります)。

(year, month)xmlを解析し、見たペアを追跡します。すでにペアを見ている場合は、その月の最新のファイルをすでに処理しているので、後続のファイルは無視できます。

何かのようなもの:

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 に答える