特定的CSV读取过滤

时间:2018-11-12 04:40:01

标签: python csv dataframe

我对Python来说还很陌生,所以我可能正在寻找一个简单的解决方案,但是到目前为止,我所尝试的一切都是徒劳的。

我有数百个格式相同的CSV文件。我的格式是

-文件名(不重要)

-单数值(不重要)

-重要的列名称行

-多两行不重要的格式化垃圾

-成千上万的重要数据

-几行空白

-数千行不重要的垃圾再次出现

我需要对其进行格式化,以便能够轻松获取下面的列名称和重要数据。设置格式后,列名称始终位于第5行,数据始终位于第8行,但是数据量可能从几百到几千。

编辑:我弄错了标题的确切行号。另外,我忘了提到我需要将结果保存到数据框中以供将来分析。

这是csv文件顶部的图像 enter image description here 这是csv文件底部的图像。请注意,当它从“重要数据”切换为“不重要数据”时,列数增加,这可能会使编程变得困难。 enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码。我得到的列名称为行号= 5 ,数据从行号= 8开始,并在遇到空白行的地方停止

import csv,pandas as pd
Space_encounter_linenum_flag=0
index_df=-1
#This flag is set when it encounters first blank line after the data values end
with open("C:/Users/user/PycharmProjects/spacysample/MrX.csv", 'r') as csvfile:
     csvreader = csv.reader(csvfile, delimiter=',')
     for row in csvreader:
         index_df=index_df+1
         if csvreader.line_num==5:
             #To get column names
             print("THE COLUMN NAMES IN LINE NUMBER 5 ARE...........")
             print(', '.join(row))
             df_col=pd.DataFrame(row)
         if csvreader.line_num==8:
             #To get data values
             print("**********************************************************")
             print("THE DATA VALUES STARTING FROM LINE NUMBER 8 ARE...........")
             while row[-1] is '':
                 row.pop()
             print(', '.join(row))
             df_col.append(row)
         if (csvreader.line_num>8) and max(row, key=len)=='':
             #set flag when blank line is encountered
             Space_encounter_linenum_flag=1
         if (csvreader.line_num>8 and row is not '') and (row is not '') and Space_encounter_linenum_flag!=1:
             #stop where blank line is encountered
             while row[-1] is '':
                 row.pop()
             print(', '.join(row))
             df_val=pd.DataFrame(row)
             df_col.append(df_val)
         if (csvreader.line_num>8) and Space_encounter_linenum_flag==1:
             print('Loop breaks at, line number: '+str(csvreader.line_num))
             break

希望这正是您想要的。

答案 1 :(得分:0)

import pandas as pd
df = pd.read_csv('path_to_your_csv', header=5)[7:]
# List Columns
df.columns

如果您没有熊猫:pip install pandas

read_csv文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html