【发布时间】:2015-07-20 15:11:31
【问题描述】:
我正在尝试合并一组预先排序的文件,其中每个文件中的每一行都是一个整数:
for line in heapq.merge(*files):
排序成功完成,但比较文件内容为字符串,而不是整数。如何强制进行整数比较?
【问题讨论】:
-
无法在内存中存储文件,需要即时读取大文件。
标签: python sorting casting merge
我正在尝试合并一组预先排序的文件,其中每个文件中的每一行都是一个整数:
for line in heapq.merge(*files):
排序成功完成,但比较文件内容为字符串,而不是整数。如何强制进行整数比较?
【问题讨论】:
标签: python sorting casting merge
试试这个:
for line in heapq.merge(*(map(int, file) for file in files)):
这不会在比较过程中将字符串解释为整数,而是在运行时将它们更改为整数。因此,结果是整数,而不是字符串。如果需要,当然可以转换回字符串:
for line in map(str, heapq.merge(*(map(int, file) for file in files))):
供其他人/未来参考:这适用于 Python 3,其中map 返回一个迭代器。在 Python 2 中,map 需要替换为 itertools.imap,以便在启动时不会将所有内容读入内存。
【讨论】:
尝试读取文件并将每一行转换为整数。这假设所有数据都适合内存。
def read_as_int_list(file_name):
with open(file_name) as fobj:
return [int(line) for line in fobj]
这应该更节省内存:
def read_as_ints(file_name):
with open(file_name) as fobj:
for line in fobj:
yield int(line)
用法:
files = (read_as_ints(name) for name in list_of_file_names)
for line in heapq.merge(*files):
print(line)
【讨论】: