Python打开一个大文本文件,但只加载包含预定义列值的行应该怎么解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (40)

正在尝试读取一个非常大的文本文件(.dat文件) - 太大而无法完整打开

真正的文本文件有32列和未知数量的行。我只关心列15中的值小于40,列21中的值介于10 - 25之间的行。有没有一种方法来指定这些约束,当打开和加载文件在Python中,以便我避免在我不关心的内容上浪费内存?

这里是一个例子:

假设我们有一个包含100个数据(25行和4列)的文件,我们只想读取列nr 2中的值小于40并且列nr 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')
提问于
用户回答回答于

可以使用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)

扫码关注云+社区

领取腾讯云代金券