在这种情况下,为什么 read_csv skiprows 值需要低于应有的值?

RMR*_*ver 5 python csv dataframe python-3.x pandas

我有一个日志文件(在这种情况下为 Text.TXT):

# 1: 5
# 3: x
# F: 5.
# ID: 001
# No.: 2
# No.: 4
# Time: 20191216T122109
# Value: ";"
# Time: 4
# Time: ""
# Time ms: ""
# Date: ""
# Time separator: "T"
# J: 1000000
# Silent: false
# mode: true
Timestamp;T;ID;P
16T122109957;0;6;0006
Run Code Online (Sandbox Code Playgroud)

要将此日志文件读入 Pandas 并忽略所有标题信息,我将使用skiprows最多第 16 行,如下所示:

pd.read_csv('test.TXT',skiprows=16,sep=';')
Run Code Online (Sandbox Code Playgroud)

但这会产生,EmptyDataError因为它跳过了数据开始的位置。为了完成这项工作,我不得不在第 11 行使用它:

pd.read_csv('test.TXT',skiprows=11,sep=';')
      Timestamp  T  ID  P
0  16T122109957  0   6  6
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果数据直到第 17 行才开始,在这种情况下,为什么我需要请求跳过第 11 行?

Ch3*_*teR 3

一种解决方法是使用comment参数pd.read_csv

from io import StringIO

text='''# 1: 5
# 3: x
# F: 5.
# ID: 001
# No.: 2
# No.: 4
# Time: 20191216T122109
# Value: ";"
# Time: 4
# Time: ""
# Time ms: ""
# Date: ""
# Time separator: "T"
# J: 1000000
# Silent: false
# mode: true
Timestamp;T;ID;P
16T122109957;0;6;0006'''

df = pd.read_csv(StringIO(text),comment='#',sep=';')
df
      Timestamp  T  ID  P
0  16T122109957  0   6  6
Run Code Online (Sandbox Code Playgroud)

或者

df = pd.read_csv(StringIO(text),header=0,comment='#',sep=';')
Run Code Online (Sandbox Code Playgroud)

来自标题参数下的文档:

请注意,如果skip_blank_lines=True,该参数会忽略注释行和空行,因此header=0表示数据的第一行而不是文件的第一行。

不确定skiprows这里的奇怪行为。