54

Pythonを使用して解析しようとしているファイルのディレクトリがあります。それらがすべて同じ拡張子であれば問題ありませんが、何らかの理由で、元の拡張子の後に連続した数値拡張子で作成されます。例:foo.log foo.log.1 foo.log.2 bar.log bar.log.1 bar.log.2 etc.その上、foo.logはXML形式ですが、bar.logはそうではありません。foo.log.* および foo.logファイルのみを読み取って解析するための最適なルートは何ですか?ファイルを読み取る必要はbar.logありません。以下は私のコードです:

import os
from lxml import etree
path = 'C:/foo/bar//'
listing = os.listdir(path)
for files in listing:
    if files.endswith('.log'):
        print files
        data = open(os.path.join(path, files), 'rb').read()
        tree = etree.fromstring(data)
        search = tree.findall('.//QueueEntry')

これは.log.*、ファイルを読み取らず、読み取られたがxml形式ではないファイルに対してパーサーがチョークするため、機能しません。ありがとう!

4

4 に答える 4

113

たぶん、globモジュールはあなたを助けることができます:

import glob

listing = glob.glob('C:/foo/bar/foo.log*')
for filename in listing:
    # do stuff
于 2012-11-08T20:49:46.337 に答える
16

foo.log.*およびfoo.logファイルのみを読み取って解析するための最適なルートは何ですか?bar.logファイルを読み取る必要はありません。

あなたのコードはこれを行います:

if files.endswith('.log'):

英語の説明をPythonに少し間違って翻訳しました。Pythonで書くのは、*.log「ファイルのみを読み取って解析する」という意味bar.logです。これは、含まれているものと含まれてfoo.log.1いないものを意味します。

しかし、少し考えてみると、英語の説明を直接Pythonに翻訳できます。

if files == 'foo.log' or files.startswith('foo.log.'):

foo.log.そして、考えてみれば、スキップしたい名前のファイル(余分なドットが付いている)がない限り、2つのケースを1つにまとめることができます。

if files.startswith('foo.log'):

ただし、POSIXシェルについて何か知っている場合は、foo.log*まったく同じことと一致します。(これは、ワイルドカードが拡張機能を特別に処理するWindowsシェルには当てはまりません。そのため、*.*代わりに入力する必要があり*ます。)Pythonには、WindowsでもPOSIXスタイルのワイルドカードを実行するモジュールが付属していますglob。これを使用する方法については、stranacの回答を参照してください。

glob手動でフィルタリングするよりも答えの方が良いと思いますlistdir。それはより単純で、質問のタイトルがあなたがやりたいと言っていることとより直接的に一致し(あなたが望んでいたことを正確に実行しますos.listdirが、glob.glob代わりに)、より柔軟です。したがって、ワイルドカードの2つのわずかに異なる意味に混乱することを心配しない限り、これの代わりにそれを受け入れることをお勧めします。

于 2012-11-08T23:52:33.937 に答える
7

これにより、bashのような正規表現が得られます。

import glob
print(glob.glob("/tmp/o*"))

または、ディレクトリ全体をos.listdirし、reモジュールを介して正規表現と一致しないファイルを破棄することもできます。

于 2012-11-08T20:50:23.703 に答える
0

すでに述べたように、glob.globを使用して、ワイルドカードを使用してファイルを検索できます。コメントを書くことができず、非常に古い質問ですが...誰かが提案したように、glob.globはパス内で〜を展開できません。したがって、os.path.expanduserを使用して、os.path.expandvarsを使用して環境変数を展開できます。

于 2021-03-06T10:43:13.063 に答える