我有一个excel数据,我用python pandas读入:
import pandas as pd data = pd.read_csv('..../file.txt', sep='\t' )
模拟数据看起来像这样:
unwantedjunkline1 unwantedjunkline2 unwantedjunkline3 ID ColumnA ColumnB ColumnC 1 A B C 2 A B C 3 A B C ...
在这种情况下,数据包含3个垃圾行(我不想读入的行),然后点击标题,有时它包含4个或更多的垃圾行.所以在这种情况下我读了数据:
data = pd.read_csv('..../file.txt', sep='\t', skiprows = 3 )
数据看起来像:
ID ColumnA ColumnB ColumnC 1 A B C 2 A B C 3 A B C ...
但是每次不需要的行数不同时,是否有办法使用pandas读取表文件而不使用'skiprows =',而是使用一些匹配头的命令,以便它知道从头开始读取?所以我不必单击打开文件来计算每次文件包含多少不需要的行,然后手动更改'skiprows ='选项.
如果你知道标题的开头:
def skip_to(fle, line,**kwargs): if os.stat(fle).st_size == 0: raise ValueError("File is empty") with open(fle) as f: pos = 0 cur_line = f.readline() while not cur_line.startswith(line): pos = f.tell() cur_line = f.readline() f.seek(pos) return pd.read_csv(f, **kwargs)
演示:
In [18]: cat test.txt 1,2 3,4 The,header foo,bar foobar,foo In [19]: df = skip_to("test.txt","The,header", sep=",") In [20]: df Out[20]: The header 0 foo bar 1 foobar foo
通过调用.tell
我们跟踪指针在前一行的位置,所以当我们点击标题时,我们寻找回到该行并将文件对象传递给pandas.
或者使用垃圾,如果它们都是从一些共同点开始的:
def skip_to(fle, junk,**kwargs): if os.stat(fle).st_size == 0: raise ValueError("File is empty") with open(fle) as f: pos = 0 cur_line = f.readline() while cur_line.startswith(junk): pos = f.tell() cur_line = f.readline() f.seek(pos) return pd.read_csv(f, **kwargs) df = skip_to("test.txt", "junk",sep="\t")