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 将表现出相同的行为
我需要用 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 将表现出相同的行为