Форум сайта python.su
2
Почему-то мой скрипт не пишет, в файл строки начинающиеся с большой буквы.
Код прокоментирован.
Файл для примера:
fsgfdhHoho - не пишет в файл h.txt
sgfjfjhlkl;
hgfhg;lk
Hoho
hy
#!/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
Отредактировано mironich (Янв. 18, 2013 10:27:08)
Офлайн
857
не используй exit в программах, есть sys.exit()
mironichмного буквcurl_file.write(''.join([line, '\n']))
'%s\n' % line
mironichнапиши задание
Что делает скрипт:
Открывает файл, читает в список все строки из него.
Сортирует его просто вызвав метод sort.
И пишет все строки начинающиеся с определенной буквы в файл вида: *.txt где *-буква.
Офлайн
2
напиши заданиеВ смысле?
Офлайн
2
Ух я *******.
Часов 5 мучался над проблемой.
Файл перезаписывался просто..
Надо так.
Предварительно очистив директорию от старых файлов.
try: curl_file = open(make_fn(cur_char), 'a', 0) except IOError: curl_file = open(make_fn(cur_char), 'w', 0)
Отредактировано mironich (Янв. 18, 2013 10:26:43)
Офлайн
857
mironichчто нужно сделать, а не что делает скрипт
В смысле?
Офлайн
2
py.user.nextОтсортировать файл, и записать строки из файла в файлы называющиеся первым символом строки.
что нужно сделать, а не что делает скрипт
Офлайн
43
можно проще, возня с кодами лишняя
import string fit = string.ascii_lowercase + string.digits empty = ok = 0 for line in sorted(open('test.txt').readlines()): if line != '\n': ok += 1 first = line[0].lower() name = first if first in fit else 'invalid' with open(name+'.txt','a') as f: f.write(line) else: empty += 1 print(empty,ok)
del lines
Отредактировано sergeek (Янв. 21, 2013 13:19:18)
Офлайн
2
with open(name+'.txt','a') as f: f.write(line)
Офлайн
43
если его нет создастся, если есть допишет в конец
Офлайн
857
#!/usr/bin/env python3 # сортирует файл, и записывает его строки в файлы, # называя их по первому символу строки # (строки, начинающиеся на A или a, пишет в файл a.txt и.т.д) ifname = "file.txt" with open(ifname, "r", encoding='utf-8') as fin: sorted_lines = sorted(fin, key=lambda line: line.lower()) lines = tuple(i for i in sorted_lines if i.strip()) # в lines - отсортированные строки first_chars = [] seen = set() for line in lines: # в first_chars - первые символы пройденных строк, # добавленные в seen ch = line[0].lower() if ch not in seen: first_chars.append(ch) seen.add(ch) # в first_chars - первые символы строк без повторов for ch in first_chars: with open(ch + '.txt', 'w', encoding='utf-8') as fout: lines_group = filter(lambda line: line[0].lower() == ch, lines) fout.write(''.join(lines_group)) # в файле все строки начинаются с ch # созданы файлы с именами из first_chars, и в них # записаны соответствующие строки print('ok')
Офлайн