从大文件创建较小的块并对块进行排序

时间:2013-09-13 07:22:09

标签: python python-2.7

我在python中实现外部排序,目前仍然遇到这个问题。我已经将包含整数的大文本文件分成了小块,我正在尝试对这些块进行排序。到目前为止,我能写出这么多。

with open(fpath,'rb') as fin:
    input_iter = iter(lambda: fin.read(40 * 1024),'')
    for item in input_iter:
        print item
        current_chunk = list(item)
        # sort the buffers
        current_chunk.sort(key = lambda x : int(x))

当我执行此代码时,出现错误

File "problem3.py", line 68, in <lambda>
current_chunk.sort(key = lambda x : int(x))
ValueError: invalid literal for int() with base 10: ''

我猜这是因为这行input_iter = iter(lambda: fin.read(40 * 1024),'') 他们是另一种解决这个问题的方法。 谢谢

1 个答案:

答案 0 :(得分:3)

您的输入中有空格:

>>> int(' ')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''
>>> int('\n')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''
>>> int('\t')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''

转换为int时会删除空格,因此会出现令人困惑的错误消息;请注意异常消息中的引号之间是否有 nothing (Python 3已修复此问题)。

剥离空间:

current_chunk = filter(None, map(str.strip, item))

或避免将它们转换为整数:

current_chunk.sort(key=lambda x: int(x) if x.strip() else x)