找到空白行后将数据加载到 df

Loading data into df after finding blank line

当输入文件有时是 .csv 有时是 .xls 时,查找文件中第一个换行符的最佳方法是什么。换行是有保证的,但是读取文件时换行总是在随机一行。输入文件将有一定数量的行,总是在顶部。此数据会因一两行而异。所以我将跳过前 4、5、6,因为这种不可预测性。我的目标是将超过该点的数据读入 DataFrame,跳过第一行。第一个空行之后的行是我将开始将数据读入 df 的地方。所以只是跳过这个可变数量的行的东西是我所缺少的,我有一个识别文件类型的小函数,如果该代码 returns true 文件是 xls 文件,如果 false 文件是 CSV 文件.在我下面的示例文件中,第一个空白行位于第 7 行。

1:CSV

这会永远读取,我必须中断执行才能让程序退出。一个关键点,当 运行 f.readline() 并逐行查看输出时,我注意到文件通过了空行,因为它不是预期的 '\n' 。相反,它总是类似于 ',,,,,,,,,,\n',在我的许多 csv 文件中不一致。我怎样才能写一些东西来将其标识为空白行,而不必总是调整代码以说明 CSV 文件中第一个空白行中的新逗号数量?

import pandas as pd

file = 'input_file.csv'

f = open(file)

while f.readline() not in ('\n'):
        pass

final_df = pd.read_csv(f, header=None)

例子file.

report
random info
more info
Project number 111111
Order number
Plates Plate1 Plate2 Plate3
DNA \ Assay id1 id2 id3
Name1 C:C G:G T:C
Name2 C:C G:G C:C
Name3 C:C G:G T:C

正在寻找换行符的 readline 函数的当前输出,在换行符处:

',,,,,,,,,,\n'

final_df 预期输出

DNA \ Assay id1 id2 id3
Name1 C:C G:G T:C
Name2 C:C G:G C:C
Name3 C:C G:G T:C

2:XLS

当文件为 xls 文件格式时,它们看起来与我上面使用的示例文件完全相同。示例文件提供了该问题所需的数据,无需更改。

如果文件是作为 xls 文件输入的,我的想法是

import pandas as pd

df = pd.read_excel(file)

f = tempfile.NamedTemporaryFile()

df.to_csv(f)

f.seek(0)

line = str(f.readline()).strip()

print(line)returns

之后的当前输出
b',report,Unnamed: 1,Unnamed: 2,Unnamed: 3,Unnamed: 4,Unnamed: 5,Unnamed: 6,Unnamed: 7,Unnamed: 8,Unnamed: 9,Unnamed: 10,Unnamed: 11,Unnamed: 12,Unnamed: 13,Unnamed: 14,Unnamed: 15,Unnamed: 16,Unnamed: 17,Unnamed: 18,Unnamed: 19,Unnamed: 20,Unnamed: 21,Unnamed: 22,Unnamed: 23,Unnamed: 24,Unnamed: 25,Unnamed: 26,Unnamed: 27,Unnamed: 28,Unnamed: 29,Unnamed: 30,Unnamed: 31,Unnamed: 32,Unnamed: 33,Unnamed: 34,Unnamed: 35,Unnamed: 36,Unnamed: 37,Unnamed: 38,Unnamed: 39,Unnamed: 40,Unnamed: 41,Unnamed: 42,Unnamed: 43,Unnamed: 44,Unnamed: 45,Unnamed: 46\n'

如果有另一种方法可以找到带有 pd.read_excel(line) 的第一个空行,我不想继续以这种方式读取文件。

预期输出与上面在 final_df

中列出的相同

理想情况下,我会使用 final_df = pd.read_csv(line) 之类的东西来生成 final_df,但这是行不通的。

DNA \ Assay id1 id2 id3
Name1 C:C G:G T:C
Name2 C:C G:G C:C
Name3 C:C G:G T:C

我认为处理此问题的最简单方法,特别是考虑到您可能有 csv 或 xls 文件,就是读取数据并在之后清理它。这样的事情可能会有所帮助并且适用于两种格式:

df = pd.read_excel(file)
new_line = min(df[df.iloc[:,0].isnull()].index)
df.columns = df.iloc[new_line+1]
df = df.iloc[new_line+2:, :]

基本上你读取了整个文件,找到第一个空行,并从“new_line”开始重建数据帧。