Python:mmap文件中的csv.reader工作不正确

时间:2015-08-08 11:48:13

标签: python csv mmap

我需要用Python解析一个相当大的csv文件。为此我使用csv(文件包含引号),我想使用多处理并行此过程。每个进程只读取mmap文件对象的行。但是在实现这种方法时我遇到了下一个问题(我知道python with statement,这只是一个演示):

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']

那是对的,但请考虑这个例子:

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 beacuse,没有其他方法可以允许多个进程使用同一个文件。 问题是,为什么csv.reader对mmap对象表现得如此奇怪? mmap对象与标准python文件对象具有相同的api,因此csv.reader可以正常工作。

1 个答案:

答案 0 :(得分:1)

您可以使用带有readline的iter来阅读每一行:

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

如果你遍历m,你将一次得到一个字符,所以将m传递给读者会表现出相同的行为