2015-08-08 107 views
1

我需要用Python解析一个相当大的csv文件。为此我使用csv(文件包含引号),并且我想使用多处理来并行执行此过程。每个进程只会从mmap文件对象中读取它的行。但在实施这一方法,我所面临的下一个问题(我知道有声明蟒蛇,这仅仅是一个演示):Python:在mmap文件上的csv.reader工作不正确

import csv 


f = open('temp', 'r+b') 

reader = csv.reader(f) 
reader.next() 

f.close() 

。OUPUTS:

['1000415037534300', '2013-07-14 13:25:13.000000', 'request', '281', 'Camino', 'LG'] 

和that`s正确的,但考虑到这例如:

import csv 
import mmap 


f = open('temp', 'r+b') 
m = mmap.mmap(f.fileno(), 0) 

reader = csv.reader(m) 
reader.next() 
reader.next() 
reader.next() 

m.close() 
f.close() 

打印

['1'] 
['0'] 
['0'] 

换句话说,它从文件中读取一个字节。 我必须使用mmap,因为没有其他方法允许多个进程使用同一个文件。 问题是,为什么csv.reader的行为如此奇怪与mmap对象? mmap对象与standart python文件对象具有相同的API,因此csv.reader可以正常工作。

回答

1

您可以使用iter与readline的阅读每一行:

reader = csv.reader(iter(m.readline, "")) 

如果您遍历m,你会在同一时间得到一个字符,从而使米到读者会出现相同的行为

+0

有为什么mmap以这种方式实现迭代器? –

+1

我想你可以像m [:n]'那样对mmap对象进行切片以获得n个字节这一事实是有意义的,它以字节而不是行或m [:n]'进行迭代会给你n行而不是n字节 –