Необходимость запуска readlines () и read ().Есть ли более эффективный подход - PullRequest
0 голосов
/ 28 сентября 2018

это похоже на глупую проблему, но здесь идет речь.

У меня много файлов данных для обработки, каждый файл имеет переменное количество строк преамбулы перед основными данными.Обработка требует, чтобы я нашел некоторые значения в преамбуле и затем прочитал основные данные в pandas df.

Из преамбулы мне нужно количество строк, которые я могу сделать:

with open(csvfile) as f:
data = f.readlines()
for num, line in enumerate(data, 0):
    if end_preamble in line:
        lines = num

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

with open(csvfile) as f:
    data = f.read()
term1 = re.finall...(regex term)..

обе эти работы, но read() не возвращает номера строк, поскольку (как я понимаю) он интерпретирует текст как одну строку.И наоборот, readlines() нельзя переопределить для строки (я думаю, потому что она не сохраняется - но я вполне могу ошибаться).

На данный момент у меня есть хак:

with open(csvfile) as f:
    data = f.read(250)
lines = data.count('\n')
term1 = re.finall.....

Это работает, поскольку большую часть времени преамбула имеет длину менее 250 байт.Но если у меня есть файл с очень короткой или очень длинной преамбулой, это не сработает.

Файлы не очень большие, поэтому я могу использовать readlines(), а также read(), но читая файл дваждыкажется неэффективным способом выполнить то, что кажется относительно тривиальной задачей.Есть ли более эффективный метод сочетания двух потребностей?

1 Ответ

0 голосов
/ 28 сентября 2018

Используйте readline() вместо readlines().Это позволит вам прочитать любое количество строк, но только преамбулу файла (не весь файл):

with open(csvfile) as f:
    num = 0
    while end_preamble not in f.readline():
        num += 1

В результате вы получите num, который является номером последней строки впреамбула.

РЕДАКТИРОВАТЬ.

Если вы хотите открыть файл только один раз (подверженный ошибкам способ), вы можете сделать это так:

with open(csvfile, mode='rb') as f:
    preamble = b''
    line = f.readline()
    while end_preamble.encoded('UTF-8') not in line:
        preamble += line
    preamble = preamble.decoded('UTF-8')

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