Хорошо, такая быстрая (и, вероятно, хрупкая) идея:
import pandas as pd
df = pd.DataFrame(columns=["ints_only", "strings_only"],
data=[[1,"a"], [3,"b"]])
df.to_csv("header.csv")
df.to_csv("noheader.csv", header=None)
def has_header(file, nrows=20):
df = pd.read_csv(file, header=None, nrows=nrows)
df_header = pd.read_csv(file, nrows=nrows)
return tuple(df.dtypes) != tuple(df_header.dtypes)
has_header("header.csv") # gives True
has_header("noheader.csv") # gives False
Что здесь происходит?
Мы читаем первые nrows (по умолчанию 20) строки файла csv. Один раз с заголовком и один раз без. Затем мы рассмотрим, какие типы данных панды присваивают каждому столбцу. Если типы данных не изменяются при игнорировании первой строки, тогда заголовок отсутствует (это, конечно, работает только в том случае, если у вас всегда есть хотя бы один столбец, где заголовок является строкой, но все остальные записи принадлежат одному другому типу данных, который не является строка, например, все плавающие).