Специальная фильтрация чтения CSV - PullRequest
0 голосов
/ 12 ноября 2018

Я довольно новичок в Python, поэтому, возможно, я ищу простое решение, но все, что я пробовал до сих пор, было бесплодным.

У меня есть сотни CSV-файлов с одинаковым форматом. Формат у меня есть

- Имя файла (неважно)

- Однозначное значение (неважно)

- Важные имена столбцов

- еще две строки несущественного форматирования мусора

- Тысячи строк важных данных

- Несколько пустых строк

- Тысячи рядов несущественного мусора снова

Мне нужно отформатировать его, чтобы я мог легко получить названия столбцов и важные данные внизу. Формат установлен так, что имена столбцов всегда находятся в строке 5, а данные всегда начинаются со строки 8, но объем данных может варьироваться от нескольких сотен до нескольких тысяч.

РЕДАКТИРОВАТЬ: Я получил точный номер строки заголовка неправильно. Кроме того, я забыл упомянуть, что мне нужно сохранить результат в кадре данных для последующего анализа.

Это изображение верхней части файла CSV enter image description here Это изображение нижней части файла CSV. Обратите внимание, что при переключении с «важных данных» на «неважные данные» количество столбцов увеличивается, что может затруднить программирование. enter image description here

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы можете использовать приведенный ниже код. Я получил имена столбцов с номером строки = 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

Надеюсь, это именно то, что вы хотите.

0 голосов
/ 12 ноября 2018
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...