我有一个excel数据,我用python pandas读入:
import pandas as pd
data = pd.read_csv('..../file.txt', sep='\t' )
Run Code Online (Sandbox Code Playgroud)
模拟数据看起来像这样:
unwantedjunkline1
unwantedjunkline2
unwantedjunkline3
ID ColumnA ColumnB ColumnC
1 A B C
2 A B C
3 A B C
...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,数据包含3个垃圾行(我不想读入的行),然后点击标题,有时它包含4个或更多的垃圾行.所以在这种情况下我读了数据:
data = pd.read_csv('..../file.txt', sep='\t', skiprows = 3 )
Run Code Online (Sandbox Code Playgroud)
数据看起来像:
ID ColumnA ColumnB ColumnC
1 A B C
2 A B C
3 A B C
...
Run Code Online (Sandbox Code Playgroud)
但是每次不需要的行数不同时,是否有办法使用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)
Run Code Online (Sandbox Code Playgroud)
演示:
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
Run Code Online (Sandbox Code Playgroud)
通过调用.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")
Run Code Online (Sandbox Code Playgroud)