私はよく、数列(通常は10未満)と最大数千万行を含むASCIIテーブルを扱います。彼らはのように見えます
176.792 -2.30523 0.430772 32016 1 1 2
177.042 -1.87729 0.430562 32016 1 1 1
177.047 -1.54957 0.431853 31136 1 1 1
...
177.403 -0.657246 0.432905 31152 1 1 1
ファイルを読み取り、操作し、保存するPythonコードがいくつかあります。私はいつもそれを使ってきnumpy.loadtxt
ましnumpy.savetxt
た。ただし、numpy.loadtxt
1GbのASCIIファイルを読み取るには少なくとも5〜6GbのRAMが必要です。
昨日、私はパンダを発見しました。これにより、ほとんどすべての問題が解決pandas.read_table
しnumpy.savetxt
ました。メモリ効率が非常に高く、スクリプトの実行速度(2)が3倍または4倍向上しました。
最初にコメント行がいくつか含まれているファイルを読み込もうとするまでは、すべて問題ありません。doc文字列(v = 0.10.1.dev_f73128e)は、行コメントがサポートされていないことを示しています。これは素晴らしいことだと思います。の行コメントを除外するのが本当に好きnumpy.loadtxt
です。これがどのように利用可能になるかについてのアイデアはありますか?それらの行をスキップする可能性があるのもいいでしょう(ドキュメントはそれらがempyとして返されると述べています)
ファイルにコメント行がいくつあるかわからない(さまざまな人からのコメント行を何千も処理している)ので、ファイルを開いて、ファイルの先頭にあるコメントで始まる行数を数えます。
def n_comments(fn, comment):
with open(fname, 'r') as f:
n_lines = 0
pattern = re.compile("^\s*{0}".format(comment))
for l in f:
if pattern.search(l) is None:
break
else:
n_lines += 1
return n_lines
その後
pandas.read_table(fname, skiprows=n_comments(fname, '#'), header=None, sep='\s')
それを行うためのより良い方法(おそらくパンダ内)はありますか?
pandas.io.parsers.py
最後に、投稿する前に、内部でどのように機能するかを理解するためにコードを少し調べましたが、pandas.read_table
迷子になりました。誰かがファイルの読み取りを実装する場所を教えてもらえますか?
ありがとう
EDIT2: @ThorstenKranzif
の2番目の実装のいくつかを取り除くためにいくつかの改善を得ると思いましたがFileWrapper
、ほとんど改善されませんでした
class FileWrapper(file):
def __init__(self, comment_literal, *args):
super(FileWrapper, self).__init__(*args)
self._comment_literal = comment_literal
self._next = self._next_comment
def next(self):
return self._next()
def _next_comment(self):
while True:
line = super(FileWrapper, self).next()
if not line.strip()[0] == self._comment_literal:
self._next = self._next_no_comment
return line
def _next_no_comment(self):
return super(FileWrapper, self).next()