4

こんにちは私はパンダを使用して一連のファイルを読み取り、それらをデータフレームに連結しています。私のファイルには、最初に、無視したい可変長のゴミがたくさんあります。pd.read_csv()skiprowsメソッドがあります。このケースを処理する関数を作成しましたが、機能させるにはファイルを2回開く必要があります。もっと良い方法はありますか?

HEADER = '#Start'

def header_index(file_name):
    with open(file_name) as fp:
        for ind, line in enumerate(fp):
            if line.startswith(HEADER):
                return ind

for row in directories:
    path2file = '%s%s%s' % (path2data, row, suffix)
    myDF = pd.read_csv(path2file, skiprows=header_index(path2file), header=0, delimiter='\t')

どんな助けでも大歓迎です。

4

2 に答える 2

0

ファイルのようなオブジェクトも受け入れるためread_csv()、ファイル名を渡す代わりに、そのオブジェクトを渡す前に先頭のジャンク行をスキップできます。

例:

交換

df = pd.read_csv(filename, skiprows=no_junk_lines(filename), ...)

と:

def forward_csv(f, prefix):
    pos = 0
    while True:
        line = f.readline()
        if not line or line.startswith(prefix):
            f.seek(pos)
            return f
        pos += len(line.encode('utf-8'))

df = pd.read_csv(forward_csv(open(filename), HEADER), ...)

ノート:

  • readline()EOF に達すると空の文字列を返します
  • tell()位置を追跡するために呼び出さないと、いくつかのlseekシステムコールが節約されます
  • の最後の行はforward_csv()、入力ファイルが ASCII または UTF-8 でエンコードされていることを前提としています - そうでない場合は、この行を調整する必要があります
于 2020-11-01T17:52:20.067 に答える