2013-10-02 51 views
1

我有一個熊貓數據幀可以概括爲這樣,當一個特定的字符串:熊貓:忽略所有線下讀入文件到一個數據幀

[Header] 
Some_info = some_info 
[Data] 
Col1 Col2 
0.532 Point 
0.234 Point 
0.123 Point 
1.455 Square 
14.64 Square 
[Other data] 
Other1 Other2 
Test1 PASS 
Test2 FAIL 

我的目標是隻讀[Data]之間的文本部分和[Other data],這是可變的(不同的長度)。標題的長度始終相同,因此可以使用pandas.read_csvskiprows。但是,skipfooter需要行數跳過,這可以在文件之間更改。

這裏最好的解決方案是什麼?除非沒有其他解決方案,否則我想避免在外部更改文件。

回答

1

此方法必須在文件上運行兩次。

import itertools as it 

def get_footer(file_): 
    with open(file_) as f: 
     g = it.dropwhile(lambda x: x != '[Other data]\n', f) 
     footer_len = len([i for i, _ in enumerate(g)]) 
    return footer_len 

footer_len = get_footer('file.txt') 
df = pd.read_csv('file.txt', … skipfooter=footer_len) 
4

與NumPy的genfromtxt必須採取一個發電機爲輸入(而不是直接的文件)的能力 - 發電機可以只是停止,因爲它擊中你的頁腳儘快產生。生成的結構化數組可以轉換爲熊貓數據框。這並不理想,但它看起來並不像熊貓的read_csv可以直接使用發生器。

import numpy as np 
import pandas as pd 

def skip_variable_footer(infile): 
    for line in infile: 
     if line.startswith('[Other data]'): 
      raise StopIteration 
     else: 
      yield line 


with open(filename, 'r') as infile: 
    data = np.genfromtxt(skip_variable_footer(infile), delimiter=',', names=True, dtype=None) 

df = pd.DataFrame(data) 
+0

我喜歡這個答案,因爲它可以修改爲以一般方式過濾行。謝謝! – rocarvaj