Python 在元数据之后检测CSV的开始

Python 在元数据之后检测CSV的开始,python,pandas,dataframe,csv,Python,Pandas,Dataframe,Csv,我正在使用HDT Jena收集数据,并将其存储在csv文件中以供进一步使用。不幸的是,元数据被添加到文件的开头和结尾。 目标:检测元数据的结束位置和标头的位置,以便在数据帧中读取(使用熊猫)。 第一次尝试并发现问题:首先,我注意到它总是以字符串[INFO]开头。 我最初的解决办法是: def find_beginning(csv_file): textfile = open(csv_file) f = textfile.readlines() for num, line

我正在使用HDT Jena收集数据,并将其存储在
csv
文件中以供进一步使用。不幸的是,元数据被添加到文件的开头和结尾。
目标:检测元数据的结束位置和标头的位置,以便在数据帧中读取(使用熊猫)。
第一次尝试并发现问题:首先,我注意到它总是以字符串
[INFO]
开头。 我最初的解决办法是:

def find_beginning(csv_file):
    textfile = open(csv_file)
    f = textfile.readlines()
    for num, line in enumerate(f):
        if '[INFO]' in line:
            continue
        else: 
            return num
这会给我文件的开头,我会读到:

df = pd.read_csv(csv_file, skiprows=range(0, find_beginning(csv_file)))
  • 但是,在某些例外情况下第一行可能不一定以
    [INFO]
    开头,如下示例所示:

  • 此外,我正在处理许多文件,这些文件在dataframe中具有不同的标题和不同的行/列数或元素数(因此排除了查找标题或以每行元素数为标准的正则表达式的选项)

  • 我还排除了在行中查找逗号的选项,作为查找csv的一部分的行的标准,因为我不知道逗号现在是否会出现在元数据中的某个位置


有没有其他方法可以找到标题,我没有想到?

只是一些想法。这些都是“肮脏”的方式:

  • 也许您可以找到像
    (default cli)@hdt jena
    这样的“default header end line”,但要在这方面提供帮助,您必须提供更多数据
  • 也许您可以命名(所有数据集的)所有可能的列。如果是这样,您可以提供这些名称,并在之后放弃所有具有多个空值的行。(熊猫对不存在的列没有问题,它将用NULL填充)
  • 或者你必须找到所有可能的“错误行”(以[信息、下载、空等]开头)
  • 您可以计算每行的分隔符,并获取所有具有相同数量分隔符的行
  • 或者你可以尝试一下,除了:
  • 示例输出:

    0 col1 col2 col3
    1    1  4.4   99
    2    2  4.5  200
    3    3  4.7   65
    4    4  3.2  140
    

    如果这些都没有帮助,您需要提供更多数据

    我不确定是否有其他方法可以做到这一点。一种方法是尝试使用标题格式。例如,标题可能有逗号,而其他行没有。这样可以避免为每个例外情况显式编写。感谢您的建议。我目前有我有一个类似的肮脏的解决方案。我可能会添加一些你写的东西,只是为了避免遇到更多我还没有意识到的异常。
    0 col1 col2 col3
    1    1  4.4   99
    2    2  4.5  200
    3    3  4.7   65
    4    4  3.2  140