我有一个几十万行的文件,如下所示:
01,T,None,Red,Big
02,F,None,Purple,Small
03,T,None,Blue,Big
.......
我想要从整个文件中检索第 n 列的东西。例如,第 4 列为:
Red
Purple
Blue
由于文件很大,我很想知道最有效的方法。
明显的解决方案是逐行浏览文件,然后应用 split(',') 并获得数组中的第 4 项,但我想知道是否有更好的方法。
最佳答案
我认为您不能仅通过读取文件和使用 str.split()
来改进。但是,你还没有向我们展示你所有的代码......你可能想确保在处理它之前没有将整个文件读入内存(使用 file.readlines()
方法函数或 file.read()
)。
像这样的事情可能是你能做的最好的:
with open(filename, "rt") as f:
for line in f:
x = line.split(',')[3]
# do something with x
如果您希望能够将输入文件视为只包含一列,我建议将上面的内容包装在一个函数中,该函数使用 yield
来提供值。
def get_col3(f):
for line in f:
yield line.split(',')[3]
with open(filename, "rt") as f:
for x in get_col3(f):
# do something with x
鉴于文件 I/O 内容是 Python C 核心的一部分,您可能无法通过狡猾来获得太多额外的速度。但您可以尝试编写一个简单的 C 程序来读取文件、找到第四列并将其打印到标准输出,然后将其通过管道传输到 Python 程序。
如果您将经常使用相同的输入文件,那么将其保存为某种比解析文本文件更快的二进制文件格式可能是有意义的。我相信那些使用像 HDF5 这样的非常大的数据集的科学人员,Python 通过 Pandas 对此提供了很好的支持。
嗯,现在我想起来了:您应该尝试使用 Pandas 导入该文本文件。我记得 Pandas 的作者说他写了一些低级代码,大大加快了解析输入文件的速度。
哦,找到了:http://wesmckinney.com/blog/a-new-high-performance-memory-efficient-file-parser-engine-for-pandas/
嗯。查看 Pandas 文档,您似乎可以使用 read_csv()
和可选参数 usecols
来指定您想要的列的子集,它会丢弃所有其他内容。
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
我认为 Pandas 可能以速度取胜的原因:当您调用 line.split(',')
时,Python 将为每一列构建一个字符串对象,并为您构建一个列表.然后你索引列表以获取你需要的一个字符串,Python 将销毁该列表并销毁它创建的对象(除了你想要的列)。 Python 对象池中的这种“搅动”需要一些时间,并且您将该时间乘以文件中的行数。 Pandas 可以解析这些行,并仅将您需要的行返回给 Python,因此它可能会获胜。
但这一切都只是猜测。加快速度的规则是:测量。运行代码,测量它的速度,然后运行其他代码并测量,看看加速是否值得。
关于Python:检索文件中逗号分隔数据的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19440401/