Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 特定CSV读取筛选_Python_Csv_Dataframe - Fatal编程技术网

Python 特定CSV读取筛选

Python 特定CSV读取筛选,python,csv,dataframe,Python,Csv,Dataframe,我对Python还很陌生,所以我可能正在寻找一个简单的解决方案,但迄今为止我所尝试的一切都是徒劳的 我有数百个相同格式的CSV文件。我的格式是 --文件名(不重要) --单个数值(不重要) --重要列名行 --还有两行不重要的格式化垃圾 --数千行重要数据 --几行空白 --又是成千上万排不重要的垃圾 我需要对其进行格式化,以便能够轻松获取列名和下面的重要数据。设置格式时,列名总是在第5行,数据总是从第8行开始,但数据量可以从几百到几千 编辑:我把标题的确切行号弄错了。此外,我忘了提到我需要将结

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

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

--文件名(不重要)

--单个数值(不重要)

--重要列名行

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

--数千行重要数据

--几行空白

--又是成千上万排不重要的垃圾

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

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

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

如果您没有熊猫:
pip安装熊猫


读取\u csv
文档:

您可以使用以下代码。我得到了行号为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

希望这正是您想要的。

但这并不能消除我的数据下面数千行空白和不可用的行。@TinyMuffin检查我的答案,如果不起作用,请告诉我。学习愉快!嗯,我得到了一些奇怪的结果。结果从一个空行开始,然后从第521行开始打印,直到结束。它还在每一行的末尾追加大约50个空白值。这绝对比我做过的任何事情都要近。另外,您将如何将结果保存到数据帧以供进一步分析?很抱歉,应该在顶部指定。CSV中的列数和数据值相等。另外,如果可能的话,你能分享你的CSV数据样本吗?我不完全确定你的意思,但是我需要的部分中的列数不会改变,如果你是这个意思的话。在我的数据下面我不需要的部分将列数增加大约8。还有一个页脚占据了惊人的230列。如果你问它是否是一个完美的方形数据帧(即40x40,500x500),它不是。大约有21列,下面有数千个数据点。Ok。已更新代码以删除尾部空白值。看看,太好了!我相信它正是我现在需要的!非常感谢你!
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