我试着寻找其他答案,但我仍然不确定正确的方法。 我有一些非常大的.csv文件(每个可能是一个千兆字节),我想先得到他们的列标签,因为它们不是全部相同,然后根据用户偏好提取一些这些列的一些标准。 在我开始提取部分之前,我做了一个简单的测试,看看解析这些文件的最快方法是什么,这是我的代码:
def mmapUsage():
start=time.time()
with open("csvSample.csv", "r+b") as f:
# memory-mapInput the file, size 0 means whole file
mapInput = mmap.mmap(f.fileno(), 0)
# read content via standard file methods
L=list()
for s in iter(mapInput.readline, ""):
L.append(s)
print "List length: " ,len(L)
#print "Sample element: ",L[1]
mapInput.close()
end=time.time()
print "Time for completion",end-start
def fileopenUsage():
start=time.time()
fileInput=open("csvSample.csv")
M=list()
for s in fileInput:
M.append(s)
print "List length: ",len(M)
#print "Sample element: ",M[1]
fileInput.close()
end=time.time()
print "Time for completion",end-start
def readAsCsv():
X=list()
start=time.time()
spamReader = csv.reader(open('csvSample.csv', 'rb'))
for row in spamReader:
X.append(row)
print "List length: ",len(X)
#print "Sample element: ",X[1]
end=time.time()
print "Time for completion",end-start
我的结果:
=======================
Populating list from Mmap
List length: 1181220
Time for completion 0.592000007629
=======================
Populating list from Fileopen
List length: 1181220
Time for completion 0.833999872208
=======================
Populating list by csv library
List length: 1181220
Time for completion 5.06700015068
所以似乎大多数人使用的csv库真的比其他人慢很多。 也许以后当我开始从csv文件中提取数据时它被证明更快,但我还不能确定。 在开始实施之前有什么建议和提示吗? 非常感谢!
答案 0 :(得分:16)
正如其他几次指出的那样,前两种方法没有实际的字符串解析,它们只是一次读取一行而不提取字段。我想在CSV中看到的大部分速度差异都归因于此。
如果您包含的任何文本数据可能包含更多“标准”CSV语法而不仅仅是逗号,则CSV模块非常有用,尤其是在您阅读Excel格式时。如果你刚刚得到像“1,2,3,4”这样的线条,你可能会很简单,但如果你有像“1,2,'你好,我的名字就是弗雷德'这样的线你”我会疯狂地试图解析那些没有错误。 CSV还可以透明地处理引用字符串中间的换行符。一个简单的for..in没有CSV就会遇到麻烦。
如果我这样使用它,那么CSV模块对我来说读取unicode字符串一直很好:
f = csv.reader(codecs.open(filename,'rU'))
对于使用unicode,引用字符串,引用字符串中间的换行符,末尾缺少字段的行等导入数千行文件非常强大,所有这些都具有合理的读取时间。我首先尝试使用它,如果你真的需要额外的速度,只能在它上面寻找优化。
答案 1 :(得分:3)
您对消毒有多关心?
csv
模块真的很擅长理解不同的csv文件方言,并确保转义正常,但它肯定是过度杀戮,而且往往比它的价值更麻烦(特别是如果你有unicode!)< / p>
正确逃避\,
的真正天真的实现是:
import re
def read_csv_naive():
with open(<file_str>, 'r') as file_obj:
return [re.split('[^\\],', x) for x in file_obj.splitlines()]
如果您的数据很简单,这将非常有用。如果您有可能需要更多转义的数据,csv
模块可能是您最稳定的赌注。
答案 2 :(得分:2)
要读取大型csv文件,我们必须创建子进程来读取文件块。 打开文件以获取文件资源对象。 使用resource作为参数创建子进程。 将这组行读作块。 重复上述3个步骤,直至到达文件末尾。
from multiprocessing import Process
def child_process(name):
# Do the Read and Process stuff here.if __name__ == '__main__':
# Get file object resource.
.....
p = Process(target=child_process, args=(resource,))
p.start()
p.join()
有关代码,请转到此链接。这会对你有所帮助。 http://besttechlab.wordpress.com/2013/12/14/read-csv-file-in-python/
答案 3 :(得分:1)
您的前两种方法不是将每一行解析为字段。 csv
方式是解析字段的行(与行!不同!)。
你真的需要在所有行的内存中建立一个列表吗?