如何检查CSV是否有使用Python的标头?

时间:2016-10-22 14:38:17

标签: python python-2.7 csv

我有一个CSV文件,我想检查第一行是否只有字符串(即标题)。我试图避免使用像熊猫等任何额外的东西。我想我会使用if语句,如果row [0]是字符串打印这是一个CSV,但我真的不知道如何做到这一点: - 任何建议?

7 个答案:

答案 0 :(得分:9)

Python内置CSV module可以提供帮助。 E.g。

import csv
with open('example.csv', 'rb') as csvfile:
    sniffer = csv.Sniffer()
    has_header = sniffer.has_header(csvfile.read(2048))
    csvfile.seek(0)
    # ...

答案 1 :(得分:2)

我做这样的事情:

is_header = not any(cell.isdigit() for cell in csv_table[0])

给定CSV表csv_table,抓住顶部(第0个)行。遍历单元格并检查它们是否包含任何纯数字字符串。如果是这样,它不是标题。在整个表达式前面用not来否定它。

结果:

In [1]: not any(cell.isdigit() for cell in ['2','1'])
Out[1]: False

In [2]: not any(cell.isdigit() for cell in ['2','gravy'])
Out[2]: False

In [3]: not any(cell.isdigit() for cell in ['gravy','gravy'])
Out[3]: True

答案 2 :(得分:1)

对于不一定是“.csv”格式的文件,这非常有用:

built-in function in Python to check Header in a Text file

    def check_header(filename):
        with open(filename) as f:
            first = f.read(1)
        return first not in '.-0123456789'

回答者:https://stackoverflow.com/users/908494/abarnert

发布链接:https://stackoverflow.com/a/15671103/7763184

答案 3 :(得分:0)

这是我与熊猫一起使用的功能,用于分析应将header设置为'infer'还是None

def identify_header(path, n=5, th=0.9):
    df1 = pd.read_csv(path, header='infer', nrows=n)
    df2 = pd.read_csv(path, header=None, nrows=n)
    sim = (df1.dtypes.values == df2.dtypes.values).mean()
    return 'infer' if sim < th else None

基于一个小样本,该函数检查带有和不带有标题行的dtypes的相似性。如果dtypes匹配特定百分比的列,则假定不存在标题。我发现0.9的阈值可以很好地适合我的用例。此功能也相当快,因为​​它仅读取csv文件的一小部分。

答案 4 :(得分:0)

好吧,我面对着完全相同的问题,错误地为sniffer.has_header返回了 has_header ,甚至做了一个非常简单的检查程序,对我来说都是有效的

    has_header = ''.join(next(some_csv_reader)).isalpha()

我知道它不是完美的,但似乎正在运行...为什么不简单地替换它,并检查结果是否为alpha ...然后我将其放在def和失败了..::(然后我看到了“光”
问题不在于 has_header ,问题不在于我的代码,因为我想在解析实际的.csv之前还要检查定界符...但是随着它们的前进,所有嗅探都具有“代价”在CSV中一次一行。 !!!
因此,为了使has_header正常工作,您应该确保在使用之前重置所有内容。 就我而言,我的方法是:

  def _get_data(self, filename):
        sniffer = csv.Sniffer()
        training_data = ''
        with open(filename, 'rt') as csvfile:
            dialect = csv.Sniffer().sniff(csvfile.read(2048))
            training_data = csv.reader(csvfile, delimiter=dialect.delimiter)
            csvfile.seek(0)
            has_header=csv.Sniffer().has_header(csvfile.read(2048))
            #has_header = ''.join(next(training_data)).isalpha()
            csvfile.seek(0)

答案 5 :(得分:0)

我认为检查这一点的最佳方法是 -> 只需从文件中读取第一行,然后匹配您的字符串而不是任何库。

答案 6 :(得分:0)

只需使用 try 和 except ::::::::::::::::::::::::::

import pandas as pd
try:
   data = pd.read_csv('file.csv',encoding='ISO-8859-1')
   print('csv file has header::::::')        
except:
    print('csv file has no header::::::')