Python Pandas, чтение в файле и пропуск строк перед заголовком

1

Я пытаюсь перебрать некоторые файлы и пропустить строки перед заголовком в каждом файле с помощью pandas. Все файлы находятся в одном формате данных, за исключением того, что некоторые из них имеют разное количество строк для пропусков перед заголовком. Есть ли способ перебрать файлы и начать с заголовка каждого файла, если у некоторых есть больше строк для пропусков, чем у других?

Например, для некоторых файлов требуется следующее:

f = pd.read_csv(fname,skiprows = 7,parse_dates=[0])

И некоторые требуют этого:

f = pd.read_csv(fname,skiprows = 15, parse_dates=[0])

Вот мой кусок кодового цикла над моими файлами:

for name,ID in stations:
    path = str(ID)+'/*.csv'
    for fname in glob.glob(path):
        print(fname)
        f = pd.read_csv(fname,skiprows=15,parse_dates=[0]) #could also skip 7 depending on file
        ws = f['Wind Spd (km/h)']*0.27778 #convert to m/s from km/h
        dt = f['Date/Time']
Теги:
pandas
csv
loops

2 ответа

1

Один из способов - прочитать файл с использованием чистого ввода-вывода Python для извлечения индекса, а затем skip_rows аргумент pd.read_csv.

Это довольно эффективно, так как на первом этапе используется выражение генератора, которое читается только до тех пор, пока не будет достигнута желаемая строка.

from io import StringIO
import pandas as pd
from copy import copy

mystr = StringIO("""dasfaf
kgafsda


Date/Time,num1,num2
2018-01-01,0,1
2018-01-02,2,3
""")

mystr2 = copy(mystr)

# replace mystr with open('file.csv', 'r')
with mystr as fin:
    idx = next(i for i, j in enumerate(fin) if j.startswith('Date/Time'))

# replace mystr2 with 'file.csv'
df = pd.read_csv(mystr2, skiprows=idx-1, parse_dates=[0])

print(df)

   Date/Time  num1  num2
0 2018-01-01     0     1
1 2018-01-02     2     3

Оберните это в функцию, если вам нужно повторить задачу:

def calc_skiprows(fname):
    with fname as fin:
        idx = next(i for i, j in enumerate(fin) if j.startswith('Date/Time')) - 1

df = pd.read_csv(fname, skiprows=calc_skiprows(fname), parse_dates=[0])
  • 0
    Спасибо, но строки файлов перед заголовками - это не все пустые строки, только пара строк перед заголовком пустые, а остальные содержат слова.
  • 0
    Есть ли опечатка в 5-й строке?
Показать ещё 6 комментариев
0

Первое предложение/ответ показалось, что это действительно хороший способ справиться с этим, но я не мог заставить его работать для меня по какой-то причине. Я нашел другой способ исправить мою проблему, используя try и except funcitons в python:

for name,ID in stations:
    #read in each stations .csv files, concatenate together, insert station id column
    path = str(ID)+'/*.csv'
    for fname in glob.glob(path):
        print(fname)
        try:
            f = pd.read_csv(fname,skiprows=7,parse_dates=[0])
        except:
            f = pd.read_csv(fname,skiprows=15,parse_dates=[0])
        ws = f['Wind Spd (km/h)']*0.27778 #convert to m/s from km/h
        dt = f['Date/Time']

Таким образом, если первая попытка чтения в файле завершится неудачно (пропустив 7 строк), он снова попытается использовать другую строку read_csv (пропуская 15 строк). Это не на 100% правильно, так как я все еще жестко кодирую количество строк, чтобы пропустить, но сейчас работает для моих нужд.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню