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

e0uiprwp  于 2023-02-27  发布在  Python
关注(0)|答案(8)|浏览(206)

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

ecfdbz9o

ecfdbz9o1#

Python有一个内置的CSV模块可以提供帮助。

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

gwo2fgha2#

我会这样做:

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
jhdbpxl9

jhdbpxl93#

对于不一定是.csv格式的文件,这非常有用:
Python中的内置函数,用于检查文本文件中的标题

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

camsedfj

camsedfj4#

只需使用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::::::')
aemubtdh

aemubtdh5#

下面是我在Pandas身上使用的一个函数,用来分析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

基于一个小样本,该函数检查有和没有标题行的数据类型的相似性。如果数据类型匹配一定百分比的列,则假定没有标题存在。我发现0.9的阈值对于我的用例工作得很好。该函数也相当快,因为它只读取csv文件的一个小样本。

shstlldc

shstlldc6#

我也遇到了同样的问题,错误地返回了sniffer.has_header的has_header,甚至做了一个非常简单的检查器,在我的情况下也能正常工作

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

我知道它不是完美的,但它似乎是工作...为什么不它是一个简单的替换和检查,如果结果是阿尔法或没有...然后我把它放在我的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)
r7xajy2e

r7xajy2e7#

我认为最好的检查方法是-〉简单地从文件中阅读第一行,然后匹配你的字符串,而不是任何库。

velaa5lx

velaa5lx8#

ChrisD的答案的更新版本,为空文件提供后备:

with open(filename, "r") as f:
    try:
        has_headings = csv.Sniffer().has_header(f.read(1024))
    except csv.Error:
        # The file seems to be empty
        has_headings = False

https://docs.python.org/3/library/csv.html#csv.Sniffer.has_header

相关问题