Python: открыть большой текстовый файл, но загружать только строки, содержащие предопределенное значение столбца - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь прочитать очень большой текстовый файл (файл .dat) - слишком большой, чтобы открыть его полностью - но меня не интересует полное содержание (только небольшая часть).

Настоящий текстовый файл имеет 32 столбца и неизвестное количество строк.Меня интересуют только строки, в которых значение в столбце № 15 меньше 40, а значение в столбце 21 - от 10 до 25. Есть ли способ указать эти ограничения при открытии и загрузке файла в python, чтобы избежатьтратить память на контент, который меня не волнует?

Вот пример:

Допустим, у нас есть файл из 100 данных (25 строк и 4 столбца), и мы хотим толькочитать строки (полные строки!), где значение в столбце № 2 меньше 40, а значение в столбце № 4 - от 10 до 25. Как мы можем сделать это без предварительной загрузки полного файла?

import numpy as np
# Create some examplary fake data for the text file:
textfile_content = np.random.randint(100, size=100).reshape(25,4)
print(textfile_content)
# Save text file:
np.savetxt('file.dat', textfile_content, fmt='%10.5e')

Самый близкий подход, который мне удалось найти, заключается в следующем: Чтение только определенных строк (Python)
Но это не совсем решает мою проблему, так как этот человек хочет извлечь полные столбцы, предопределенный номером столбца, а не конкретным значением данных.

1 Ответ

0 голосов
/ 10 июня 2018

Вы можете использовать dask.dataframe для ленивой загрузки данных с помощью фильтра.Внутренне эта библиотека работает по частям.Он просто скрывает порцию от пользователя и использует синтаксис Pandas, чтобы сделать использование беспроблемным.

import pandas as pd
import numpy as np
import dask.dataframe as dd

# file.csv
# 1 2 3 4
# 5 6 7 8
# ....
# 33 34 35 36
# 37 38 39 40

# read file - LAZY
df = dd.read_csv(r'C:\Temp\file.csv', header=None, sep=' ',
                 names=['col1', 'col2', 'col3', 'col4'])

# filter file - LAZY
df = df[df['col4'].between(10, 25)]

# apply computations and extract to pandas dataframe
df = df.compute()

# extract numpy array from pandas dataframe
arr = df.values

print(arr)

array([[ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20],
       [21, 22, 23, 24]], dtype=int64)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...