Прикреплённый файл «sort_file.py»
Загрузка 1 #!/usr/bin/env python
2 # coding: utf
3 '''
4 Дан очень длинный файл. Отсортировать его построчно. Условие:
5 запрещено хранить все данные из файла целиком в памяти, зато разрешено хранить
6 промежуточные файлы и переписывать исходный файл.
7 '''
8
9 import os, sys
10
11 def joinfile(f1,f2,f):
12 '''Слить два отсортированных файла f1 и f2 в файл f'''
13 s1,s2=f1.readline(),f2.readline()
14 while s1 and s2:
15 if s1 and s1<s2:
16 f.write(s1)
17 s1=f1.readline()
18 continue
19 if s2 and s2<s1:
20 f.write(s2)
21 s2=f2.readline()
22 continue
23 while s1:
24 f.write(s1)
25 s1=f1.readline()
26 while s2:
27 f.write(s2)
28 s2=f2.readline()
29
30 def newfile(L,N,mode):
31 '''Открыть новый файл с именем, вычисляемым из L и N'''
32 return open("{0}_{1}".format(L,N),mode)
33
34 def addempty(L,N):
35 '''Добавить N+1й пустой файл'''
36 out=newfile(L,N+1,"w")
37 out.close()
38 return N+1
39
40 def slice(name,prefix):
41 '''Разбить файл f в упорядоченные файлы с именами prefixN,
42 вернуть N — количество файлов'''
43 old, N, = "", 0
44 F=newfile(prefix,N,"w")
45 for s in file(name):
46 if s<old:
47 F.close()
48 N+=1
49 F=newfile(prefix,N,"w")
50 F.write(s)
51 old = s
52 F.close()
53 return N
54
55 def junksort(name):
56 '''Вариант с огромным количеством файлов (до N)'''
57
58 # Разбиваем на отрезки
59 N=slice(name,0)
60 # отрезков должно быть чётное число
61 if N%2 == 0: N=addempty(0,N)
62 # Сливаем отрезки попарно, пока их > 1
63 L=0
64 while N>0:
65 for i in xrange(0,N,2):
66 F1=newfile(L,i,"r")
67 F2=newfile(L,i+1,"r")
68 F=newfile(L+1,i/2,"w")
69 joinfile(F1,F2,F)
70 F1.close(); os.unlink(F1.name)
71 F2.close(); os.unlink(F2.name)
72 F.close()
73 N/=2
74 if N>0 and N%2 == 0: N=addempty(L+1,N)
75 L+=1
76 return F.name
77
78 outname=junksort(sys.argv[1])
79 os.rename(outname,(sys.argv[1]))
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2012-02-01 15:00:45, 1.4 KB) [[attachment:SinRand.py]]
- [получить | показать] (2012-02-01 15:01:38, 1.6 KB) [[attachment:kufas-6.13.21.py]]
- [получить | показать] (2012-01-31 19:56:28, 0.2 KB) [[attachment:ray_bibl.py]]
- [получить | показать] (2012-01-31 19:56:35, 0.8 KB) [[attachment:ray_random.py]]
- [получить | показать] (2012-02-01 15:00:22, 2.4 KB) [[attachment:sort_file.py]]
Вам нельзя прикреплять файлы к этой странице.