Как я могу помешать Pandas (Python) читать чтение строк в строках, которые я хочу пропустить? - PullRequest
2 голосов
/ 06 апреля 2020

Я использую Pandas для чтения таблицы файла журнала, разделенной ;, которая содержит 16 строк информации о файле журнала. Эти строки обозначены # перед ними.

# Logger type: CL2000
# HW rev: 7.2x
# FW rev: 5.79
# Logger ID: id0001
# Session No.: 94
# Split No.: 1
# Time: 20200222T230231
# Value separator: ";"
# Time format: 4
# Time separator: ""
# Time separator ms: ""
# Date separator: ""
# Time and date separator: "T"
# Bit-rate: 500000
# Silent mode: false
# Cyclic mode: false
Timestamp;Type;ID;Data
22T230231142;0;ad;1100000000000000
22T230231143;0;ac;0000f5ff04000000
22T230231143;0;ab;0000000000000000
22T230231143;0;aa;0000090000008000
22T230231143;0;a8;21005ac15cffd7ff
...

Проблема в том, что когда я использую Pandas для чтения этого файла, я говорю ему пропустить эти 16 строк заголовка с header поле, но строка # Value separator: ";" сбивает команду csv_read, потому что она видит разделитель там. Как этого избежать?

Вызов

sample = pd.read_csv(filename, header=11, delimiter=';')
print(sample)

дает мне

          Timestamp  Type  ID              Data
0      22T230231142     0  ad  1100000000000000
1      22T230231143     0  ac  0000f5ff04000000
2      22T230231143     0  ab  0000000000000000
...

, который является правильным выводом, который я ищу, тогда как то, что «должно» быть правильный вызов функции

sample = pd.read_csv(filename, header=16, delimiter=';')
print(sample)

выводит

       22T230231143  0  a8  21005ac15cffd7ff
0      22T230231144  0  a7  0e00000006000000
1      22T230231144  0  a6  aeffa9ff90ff0000
2      22T230231144  0  a5  59054a003d0083d5
...

, где верхняя строка - это имя столбца, взятого из середины данных. Когда я удалил символ ; из заголовка и вызвал csv_read(filename, header=16, delimiter=';'), был получен ожидаемый результат, поэтому это должна быть точка с запятой. Я не могу найти, как решить эту проблему в документации для read_csv или read_table, поэтому, если кто-нибудь знает, это было бы очень полезно.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

IIU C, вы можете установить аргумент comments в '#'; pandas автоматически выберет первую строку без # в качестве заголовка ur:

data = '''...wrapped ur data here...'''

#add the comments argument
#it will pick the first row after the hash
pd.read_csv(StringIO(data),comment='#',delimiter=';')

    Timestamp     Type  ID  Data
0   22T230231142    0   ad  1100000000000000
1   22T230231143    0   ac  0000f5ff04000000
2   22T230231143    0   ab  0000000000000000
3   22T230231143    0   aa  0000090000008000
4   22T230231143    0   a8  21005ac15cffd7ff
0 голосов
/ 06 апреля 2020

Я думаю, для этого вам понадобится небольшое регулярное выражение, чтобы прочитать ваш файл и разобрать строку, чтобы перейти к ней, так как pandas будет читать ';' в строке значения sep

import re


with open(r"your_file.csv",'r') as fin:
    for number,row in enumerate(fin):
        if re.match(r'# Value separator: ";"',row):
            row_start = number
        if not re.match('^#',row):
            skip_val = (number - row_start) + 2 # to account for 0 index & header
            break


df = pd.read_csv(your_file,sep=';',skiprows=skip_val)

print(df)

      Timestamp  Type  ID               Data
0  22T230231142     0  ad   1100000000000000
1  22T230231143     0  ac   0000f5ff04000000
2  22T230231143     0  ab   0000000000000000
3  22T230231143     0  aa   0000090000008000
4  22T230231143     0  a8   21005ac15cffd7ff
...