<p>这里有一种方法,利用<code>skip_rows</code>接受可调用函数这一事实。函数只接收正在考虑的行索引,这是该参数的一个内置限制。在</p>
<p>因此,可调用函数<code>skip_test()</code>首先检查当前索引是否在要跳过的已知索引集中。如果不匹配,则打开实际文件并检查相应的行以查看其内容是否匹配。在</p>
<p><code>skip_test()</code>函数在检查实际文件的意义上有点粗糙,尽管它只检查当前的行索引。它还假设坏行总是以同一个字符串开头(在示例中,<code>"foo"</code>),但这似乎是一个安全的假设</p>
<pre><code># example data
""" foo.csv
uid,a,b,c
0,1,2,3
skip me
1,11,22,33
foo
2,111,222,333
"""
import pandas as pd
def skip_test(r, fn, fail_on, known):
if r in known: # we know we always want to skip these
return True
# check if row index matches problem line in file
# for efficiency, quit after we pass row index in file
f = open(fn, "r")
data = f.read()
for i, line in enumerate(data.splitlines()):
if (i == r) & line.startswith(fail_on):
return True
elif i > r:
break
return False
fname = "foo.csv"
fail_str = "foo"
known_skip = [2]
pd.read_csv(fname, sep=",", header=0,
skiprows=lambda x: skip_test(x, fname, fail_str, known_skip))
# output
uid a b c
0 0 1 2 3
1 1 11 22 33
2 2 111 222 333
</code></pre>
<p>如果您确切地知道随机消息出现在哪一行,那么这将快得多,因为您可以告诉它不要检查文件内容中是否有超过潜在违规行的索引。在</p>