Python: csv.reader 在 mmap 文件上工作不正确

Python: csv.reader on mmap file works incorrect

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

import csv


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

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

f.close()

输出:

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

您可以使用 iter 和 readline 读取每一行:

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

如果您遍历 m,您将一次获得一个字符,因此将 m 传递给 reader 将表现出相同的行为