0

ポイント (x、y、z など) のテキスト ファイルで、 がヘッダー (True)であるか、そうでない (False)かを確認したいと思います。Pythonに組み込み関数があるかどうか、または自分の関数を尊重するより良い方法があるかどうかを知りたいです。

def check_header(filename, parse):
    with open(filename) as f:
        first = f.readline()
        line = first.rstrip().split(parse)
        try:
            float(line[0])
            return False
        except ValueError:
            return True

私はこの関数の例を書きました

a b c d
449628.46 6244026.59 0.47 1
449628.55 6244033.12 0.30 2 
449628.75 6244046.31 0.37 3 
449628.81 6244049.63 0.44 1 
449628.81 6244049.88 0.39 5 
449628.81 6244050.66 0.30 1 
449628.96 6244060.67 0.38 2 
449629.18 6244075.61 0.39 2 
449629.24 6244078.72 0.47 4 
449629.24 6244078.96 0.41 8 
449629.23 6244079.19 0.34 4 

check_header(filename, " ")
True

449628.46 6244026.59 0.47 1
449628.55 6244033.12 0.30 2 
449628.75 6244046.31 0.37 3 
449628.81 6244049.63 0.44 1 
449628.81 6244049.88 0.39 5 
449628.81 6244050.66 0.30 1 
449628.96 6244060.67 0.38 2 
449629.18 6244075.61 0.39 2 
449629.24 6244078.72 0.47 4 
449629.24 6244078.96 0.41 8 
449629.23 6244079.19 0.34 4

check_header(filename, " ")
False 
4

2 に答える 2

2

たとえば「3.5」などの名前の列を持つことができる場合、コードは明らかに機能しないため、できないと仮定します。

つまり、全体が少し複雑すぎるということです。本当に、最初の文字が float の有効な float 開始文字であるかどうかを確認するだけです。

def check_header(filename):
    with open(filename) as f:
        first = f.read(1)
    return first not in '.-0123456789'

空のファイルの場合、これはTrue例外を発生させる代わりに返されますが、それ以外の場合は、元のコードとまったく同じユース ケースで機能するはずです。

通常はこれについて言及することすらありませんが、質問に「最適化」というタグを付けたので、気にしていると思います。このコードは、理論的にはかなり明白な理由であなたのコードよりも高速ですが、実際には、ほとんどの場合、問題は発生しません。違い。%timeit私のマシンによると、 read/の後の部分readlineは 2.6us ではなく 244ns かかります。ご想像のとおり、これは 10 倍以上の速さです。ただし、read/readlineの部分は、ファイルが OS ディスク キャッシュにある場合は 13.1us 対 13.2us、リモート ドライブ上のファイルは 39.7ms 対 39.7ms かかります。ブロックをファイルからバッファに読み込む I/O コストは、最良の場合でも、ブロックを処理するコストを圧倒します ( でのreadline余分な処理とコードでの余分な処理の両方)。

于 2013-03-27T22:54:09.140 に答える
2

プレーンテキスト ファイルには、従来の意味でのヘッダーは実際にはありません。それはただの文字の流れです。

これがバイナリ形式の場合、厳密なヘッダーを持つことができ、リーダーはその形式に従う必要があります。これはあなたが作成したカスタム フォーマットであると思いますが、その場合は、既に適切な解決策が得られています。

ヘッダーについて詳しく知りたい場合は、単純な JPEG ヘッダーの仕様を参照してください。
http://www.fastgraph.com/help/jpeg_header_format.html

バイナリ jpeg ヘッダーを読み取る Python コードの例については、この投稿を参照してください。
Python: アップロードされたファイルが jpg かどうかを確認する

于 2013-03-27T22:45:07.243 に答える