找到空白行后将数据加载到 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”开始重建数据帧。
当输入文件有时是 .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”开始重建数据帧。