Найти - Пользователи
Полная версия: Не пишуться строки с заглавной буквой в файл[решено]
Начало » Python для новичков » Не пишуться строки с заглавной буквой в файл[решено]
1
mironich
Почему-то мой скрипт не пишет, в файл строки начинающиеся с большой буквы.
Код прокоментирован.
Файл для примера:
fsgfdh
sgfjfjhlkl;
hgfhg;lk
Hoho
hy
Hoho - не пишет в файл h.txt

Что делает скрипт:
Открывает файл, читает в список все строки из него.
Сортирует его просто вызвав метод 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
py.user.next
не используй exit в программах, есть sys.exit()

mironich
curl_file.write(''.join([line, '\n']))
много букв
'%s\n' % line

mironich
Что делает скрипт:
Открывает файл, читает в список все строки из него.
Сортирует его просто вызвав метод sort.
И пишет все строки начинающиеся с определенной буквы в файл вида: *.txt где *-буква.
напиши задание
mironich
напиши задание
В смысле?
mironich
Ух я *******.
Часов 5 мучался над проблемой.
Файл перезаписывался просто..
Надо так.
Предварительно очистив директорию от старых файлов.
try:
   curl_file = open(make_fn(cur_char), 'a', 0)
except IOError:
	curl_file = open(make_fn(cur_char), 'w', 0)
Тоесть толко если файл не существует открывать на запись, тем самым не стерая предидущие записи.
py.user.next
mironich
В смысле?
что нужно сделать, а не что делает скрипт
mironich
py.user.next
что нужно сделать, а не что делает скрипт
Отсортировать файл, и записать строки из файла в файлы называющиеся первым символом строки.
Тоесть строки начинающиеся на A или a в файл a.txt и.т.д
sergeek
можно проще, возня с кодами лишняя
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
контролировать память не нужно
mironich
  with open(name+'.txt','a') as f:
            f.write(line)
А если файл не будет создан(его нету в папке изначально)…
sergeek
если его нет создастся, если есть допишет в конец
py.user.next
#!/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')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB