Я пытаюсь получить некоторые элементы из файла CSV, но есть проблема, у него другое количество столбцов, поэтому я не могу использовать функцию pandas.read_csv (filepath) для его чтения. Мне нужно открыть его, чтобы я мог выбрать некоторые элементы, которые отображаются. Файл csv выглядит следующим образом (с добавленной пустой строкой между каждой строкой, чтобы вам было легче читать):

«Путь», «Файл», «Дата получения», «Образец», «Разное»

"C: \ msdchem \ 2 \ DATA \ AlbertVirgili \ DaniGM \", "DGM_CPTIS003 1h.D", "25 марта-19, 11:55:48", "DGM_CPTIS003 1h", ""

"INT FID1A.CH"

«Пн 25 марта 17:48:31 2019»

"Пик", "R.T.", "Начало", "Конец", "PK TY", "Высота", "Площадь", "Максимум Pct", "Всего Pct"

1, 2,082, 2,063, 2,189, "BB", 223849319, 4951058782, 100,00, 46,349

2, 2,317, 2,281, 2,386, "BB", 73209942, 1093871144, 22,09, 10,240.

3, 3,334, 3,224, 3,403, «ВВ», 93165657,2220621038, 44,85, 20,788.

4, 5,538, 5,409, 5,598, «BB», 51783798, 1975386485, 39,90, 18,492.

5, 5,744, 5,693, 5,803, «ВВ», 24084957, 360235490, 7,28, 3,337.

6, 8,716, 8,676, 8,776, "BB", 8566883, 80973220, 1,64, 0,758

«Путь», «Файл», «Дата получения», «Образец», «Разное»

"C: \ msdchem \ 2 \ DATA \ AlbertVirgili \ DaniGM \", "DGM_CPTIS003 2h.D", "25 марта-19, 12:15:42", "DGM_CPTIS003 2h", ""

"INT FID1A.CH"

"Пн 25 марта, 12:31:45 2019"

"Пик", "R.T.", "Начало", "Конец", "PK TY", "Высота", "Площадь", "Максимум Pct", "Всего Pct"

1, 2,083, 2,064, 2,194, "BB", 232382153,5255486688,100,00, 59,673

2, 2,318, 2,282, 2,384, "BB", 37916041, 587535474, 11,18, 6,671.

3, 3,32, 3,241, 3,381, «ВВ», 67715293,1373898201, 26,14, 15,600

4, 5,509, 5,406, 5,569, «ВВ», 39502747,1227609422, 23,36, 13,939

5, 5,731, 5,689, 5,791, «ВВ», 17799521,230201751, 4,38, 2,614.

6, 8,717, 8,674, 8,776, "BB", 12367646, 132409300, 2,52, 1,503.

Что мне нужно сделать, это прочитать элементы, которые находятся под заголовками: Пик, RT, Start, End, PK TY, ... но я не могу этого сделать из-за их разной длины с предыдущими строками (с заголовками Path, File , Дата приобретения...). Я не могу использовать функцию skiprows, чтобы просто исключить строки из 0-3 и 11-14, потому что количество строк в части, которую я хочу прочитать, не всегда соответствует (файлы этого типа генерируются внешней программой, и я не может изменить свою структуру). Есть ли способ, которым я могу использовать для чтения только ту часть кода CSV, которая попадает под мои нужные заголовки, чтобы я мог использовать его для выбора нужных данных из этих значений?

Заранее спасибо за помощь.

0
Dani Garcia Martos 11 Апр 2019 в 18:15

2 ответа

Лучший ответ

Вам нужно сделать некоторую предварительную обработку. Размышления об этих точках интеграции очень распространены, если вы работаете с данными из внешних систем.

Внешний файл содержит структурированные данные. Последовательность строк CSV, каждый элемент имеет 5 строк заголовка. Последняя строка заголовка содержит метки столбца CSV.

Читайте содержимое из внешнего файла. Адаптируйте приведенный ниже код под свои нужды.

external_file_content = r'''
"Path","File","Date Acquired","Sample","Misc"
"C:\msdchem\2\DATA\AlbertVirgili\DaniGM\","DGM_CPTIS003 1h.D","25-Mar-19, 11:55:48","DGM_CPTIS003 1h"," "
"INT FID1A.CH"
"Mon Mar 25 17:48:31 2019"
"Peak","R.T.","Start","End","PK TY","Height","Area","Pct Max","Pct Total"
1, 2.082, 2.063, 2.189,"BB ",223849319,4951058782,100.00, 46.349
2, 2.317, 2.281, 2.386,"BB ",73209942,1093871144, 22.09, 10.240
3, 3.343, 3.224, 3.403,"BB ",93165657,2220621038, 44.85, 20.788
4, 5.538, 5.409, 5.598,"BB ",51783798,1975386485, 39.90, 18.492
5, 5.744, 5.693, 5.803,"BB ",24084957,360235490, 7.28, 3.372
6, 8.716, 8.676, 8.776,"BB ",8566883, 80973220, 1.64, 0.758
"Path","File","Date Acquired","Sample","Misc"
"C:\msdchem\2\DATA\AlbertVirgili\DaniGM\","DGM_CPTIS003 2h.D","25-Mar-19, 12:15:42","DGM_CPTIS003 2h"," "
"INT FID1A.CH"
"Mon Mar 25 12:31:45 2019"
"Peak","R.T.","Start","End","PK TY","Height","Area","Pct Max","Pct Total"
1, 2.083, 2.064, 2.194,"BB ",232382153,5255486688,100.00, 59.673
2, 2.318, 2.282, 2.384,"BB ",37916041,587535474, 11.18, 6.671
3, 3.322, 3.241, 3.381,"BB ",67715293,1373898201, 26.14, 15.600
4, 5.509, 5.406, 5.569,"BB ",39502747,1227609422, 23.36, 13.939
5, 5.731, 5.689, 5.791,"BB ",17799521,230201751, 4.38, 2.614
6, 8.717, 8.674, 8.776,"BB ",12367646,132409300, 2.52, 1.503
'''

Разделить последовательность на уникальные части, используя четко определенный разделитель

parts = external_file_content.split('"Path","File","Date Acquired","Sample","Misc"')

Выберите одну деталь для дальнейшей обработки в панде DataFrame. Настройте pd.read_csv, чтобы пропустить 4 строки.

df = pd.read_csv(StringIO(parts[1]), skiprows=4);

Показать первые строки DataFrame

df.head(5)


    Peak    R.T.    Start   End     PK TY   Height  Area    Pct Max     Pct Total
0   1   2.082   2.063   2.189   BB  223849319   4951058782  100.00  46.349
1   2   2.317   2.281   2.386   BB  73209942    1093871144  22.09   10.240
2   3   3.343   3.224   3.403   BB  93165657    2220621038  44.85   20.788
3   4   5.538   5.409   5.598   BB  51783798    1975386485  39.90   18.492
4   5   5.744   5.693   5.803   BB  24084957    360235490   7.28    3.372
1
Sascha Gottfried 11 Апр 2019 в 16:32

Отфильтровать нечисловые строки

def gen_rows(stream):
    for row in csv.reader(stream):             
        if row.pop(0).isdigit(): # check that value is a number  
            yield row

with open('data.csv') as fo:
    df = pd.DataFrame.from_records(gen_rows(fo), 
    columns = ["Peak","R.T.","Start","End","PKTY",
                    "Height","Area","Pct Max","Pct Total"])
1
Serge 15 Апр 2019 в 15:28