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