使用Python做数据处理时,常用的读取/加载文件txt方法有以下几种:
-
numpy.loadtxt()方法
-
pandas.read_csv()方法
-
open文件方法
以前处理几K或几M的小数据集时,通常习惯使用第一种方法,没有发现有何问题。但今天突然发现,当处理数据samples个数有约38万、浮点类型、文件大小约20M的大型数据时,在内存足够的前提下,发现在Spyder中需要加载很久很久……于是寻找并对比了其他加载文件的改进方法,发现pandas.read_csv()方法及open方法都比numpy.loadtxt()方法的快了一个数量级。另外,由于文件操作涉及加载mat文件,顺便把scipy.io中的loadmat()方法拿过来对比了一下。
测试代码如下:
import datetime
import numpy as np
import scipy.io as scio
import pandas as pd
# loadtxt
start = datetime.datetime.now()
np_data = np.loadtxt('big_data.txt')
stop = datetime.datetime.now()
print(stop-start)
# read_csv
start = datetime.datetime.now()
pd_data = pd.read_csv('big_data.txt')
stop = datetime.datetime.now()
print(stop-start)
# open
start = datetime.datetime.now()
a = open('big_data.txt', 'r')
open_data= np.array(a.readlines())
a.close()
stop = datetime.datetime.now()
print(stop-start)
# loadmat
start = datetime.datetime.now()
mat_dict = scio.loadmat('big_data.mat')
mat_data = mat_dict['v0']
stop = datetime.datetime.now()
print(stop-start)
可见,在不考虑成百上千G\TB级别的大数据的前提下(此时大概率需要考虑大数据储存和分析手段去解决,涉及到诸如Spark、Hadoop、分布式等技术,不在讨论之列),几种方式读取文件的操作代码行数差不多,无非可能多一步list、dataframe、array间的互转操作而已,因此对于一般的数据分析够用。
基于上述代码和数据的测试结果(时间消耗)如下:
0:00:12.513535
0:00:00.525636
0:00:01.146893
0:00:00.177526
显然,在数据量大小一样的前提下,以耗时降序排列:
-
numpy的loadtxt方法最慢,用时约12.5s。
-
open文件的方法稍快,用时约1.1s。
-
pandas的read_csv方法更快,用时约0.5s。
-
scipy.io的loadmat方法最快,用时约0.2s。
因此,数据量达到20M、30万个samples的级别的txt格式文件时:
-
需要避免使用loadtxt方法,推荐使用pandas的read_csv而不用转换文件格式。
-
在数据源头,可以考虑将数据存为mat格式文件(比如我经常用python处理其他人提供的matlab生成的mat文件)。
最后,再次说明:以上仅仅是对20M级别的数据,在Spyder IDE环境下做的时间消耗的简单对比,可能不适用其他环境或大数据情形下。
使用Python做数据处理时,常用的读取/加载文件txt方法有以下几种:numpy.loadtxt()方法 pandas.read_csv()方法 open文件方法Python读取txt文件方法的速度对比和改进方案。
我有一个大文本
文件
(约7 GB)。我正在寻找是否存在阅读大文本
文件
的最快
方法
。我一直在阅读有关使用多种
方法
作为
读取
chunk-by-chunk以加快进程的过程。
例如,effbot建议
# File: readline-example-3.py
file = open("sample.
txt
")
while 1:
lines = file.readlines(100000)
在
读取
https://github.com/Embedding/Chinese-Word-Vectors中的中文词向量时,选择了一个有3G多的
txt
文件
,之前在做词向量时用的是word2vec,所以直接导入模型然后indexword即可。
因为这是一个
txt
大
文件
,尝试了DataFrame,np.load
txt
等,都没有成功,其中主要遇到的问题是:
如何
读取
完整的大
文件
,而不会出现内存不足me...
def Read
Txt
Data(BINARY,himg ,wimg,
txt
name):
a = np.load
txt
(
txt
name, skiprows=0, dtype=bytes).astype(str)
for u in range(himg):
for v in range(wimg):
gray = a[u][v]
if gray == '1':
1.磁盘占用率高
本人处理数据集标签
文件
的时候,经常会遇到格式转换的问题比如coco转voc,xml转voc等等。每个
文件
都不是很大,可能只有1-2k,但是架不住多啊。一多就要疯狂io,磁盘占用率就很高。刚开始发现这个问题就使用了数据结构,真的是学了这么多年数据结构,第一次感觉到了他有多牛逼。set、dict都比list 快超级多,在处理大
文件
之类的情况现象超级明显。
2.内存占用率高
将提取的内容都放在内存里了,确实节约了不少时间,但是,到最后还是会变慢。what`shappened?
内存占用.
要在
Python
中
读取
txt
文件
,需要使用
Python
的内置函数 open() 和 read()。
首先,使用 open() 函数打开
文件
,并指定
文件
的路径和
读取
模式('r' 表示只读)。
f = open('test.
txt
', 'r')
然后,使用 read() 函数
读取
文件
的内容。
content = f.read()
print(content)
最后,使用 close() 函数关闭
文件
。
f.close()
也可以使用 with 语句来打开
文件
,这样可以保证在
文件
使用完之后自动关闭
文件
。
with open('test.
txt
', 'r') as f:
content = f.read()
print(content)
在使用 read() 函数
读取
文件
内容时,也可以使用 readlines() 函数来
读取
文件
的每一行内容,并将每一行的内容存储在一个列表中。
with open('test.
txt
', 'r') as f:
lines = f.readlines()
print(lines)
在使用 readlines() 函数
读取
文件
内容时,也可以使用 for 循环来逐行
读取
文件
内容。
with open('test.
txt
', 'r') as f:
for line in f:
print(line)