Код прокоментирован.
Файл для примера:
fsgfdhHoho - не пишет в файл h.txt
sgfjfjhlkl;
hgfhg;lk
Hoho
hy
Что делает скрипт:
Открывает файл, читает в список все строки из него.
Сортирует его просто вызвав метод sort.
И пишет все строки начинающиеся с определенной буквы в файл вида: *.txt где *-буква.
#!/usr/bin/env python # -*- coding: utf-8 -*- # from sys import argv, exit fn = 'test.txt' #Имя файла для открытия... try: with open(fn, 'r') as data_f: lines = data_f.readlines() except: print 'Can`t open file %s' % fn exit() if not lines: print 'Can`t sort empty file' exit() lines.sort() digt_range = (48, 49, 50, 51, 52, 53, 54, 55, 56, 57) #Коды ansi символов(чисел) char_range = (65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90) #Коды ansi символов(букв в lowerCase) ivalid_chars_sch = -1 """ivalid_chars_sch - Счетчик кол-ва строк которые начинаються с символов не входяших в кортежи выше(digt_range, char_range) """ def make_fn(char): """ Функц возвращает имя файла, если код символа есть в кортежах(digt_range, char_range) иначе lines_with_invalid_char(тут значение ivalid_chars_sch).txt """ char_code = ord(char.upper()) if char_code not in digt_range and not char_code in char_range: global ivalid_chars_sch ivalid_chars_sch += 1 return 'lines_with_invalid_char%i.txt' % ivalid_chars_sch else: return '%s.txt' % char cur_char = '' curl_file = None empty_lines = 0 #Кол-во пустых строк ok_lines = 0 #Кол-во не пустых строк for line in lines: """" В цикле, обходим массив lines со строками из файла, если cur_char == первому символу текущей линии пишем все в файл curl_file иначе если файл открыт curl_file, закрываем его и открываем новый файл """ line = line.strip() if not line: print 'Can`t process empty line!' empty_lines += 1 continue ok_lines += 1 if cur_char != line[0].lower(): if curl_file: curl_file.close() cur_char = line[0].lower() curl_file = open(make_fn(cur_char), 'w', 0) print line curl_file.write(''.join([line, '\n'])) curl_file.close() del lines print "Processed %i" % ok_lines print "Empty lines %i" % empty_lines