Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как упростить код? работа с файлами: чтение, запись 
V
    Опции темы
proDiva
Дата 10.10.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Парни, вот еще один код в тему:
Код

def zamena(self, file1, file2):
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()
        f1=open(file1, "w")
        f2=open(file2, "w")
        k=0
        for line in list:
            i=1
            for x in line:
                if ord(x) == 138 and i == 1:
                    k+=1
                    i+=1
                else:
                    i+=1
            if k == 1:
                f1.write(line)
            else:
                f2.write(line)        
        f1.close()           
        f2.close()
        return None

В общем, содержимое файла состоит из блоков (начало блока "К...."), каждый блок - из некоторого количества строк. Нужно первый блок оставить в файле, остальное переписать в другой файл. 
Как переписать код покрасивее и поумнее?))))
PM MAIL ICQ   Вверх
pythonwin
Дата 10.10.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



proDiva, ты конечно молодец, но твой код много памяти кушает + кажется не отвечает заданию (дай пожалуйста содержимое файла)
PM WWW GTalk Jabber   Вверх
proDiva
Дата 10.10.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Цитата(proDiva @ 10.10.2006,  10:52)
Парни, вот еще один код в тему:
Код

def zamena(self, file1, file2):
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()
        f1=open(file1, "w")
        f2=open(file2, "w")
        k=0
        for line in list:
            i=1
            for x in line:
                if ord(x) == 138 and i == 1:
                    k+=1
                    i+=1
                else:
                    i+=1
            if k == 1:
                f1.write(line)
            else:
                f2.write(line)        
        f1.close()           
        f2.close()
        return None

В общем, содержимое файла состоит из блоков (начало блока "К...."), каждый блок - из некоторого количества строк. Нужно первый блок оставить в файле, остальное переписать в другой файл. 
Как переписать код покрасивее и поумнее?))))

Пжалуйста, но все работает как надо))

Это сообщение отредактировал(а) proDiva - 10.10.2006, 11:51

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  TL091618.TXT 2,15 Kb
PM MAIL ICQ   Вверх
proDiva
Дата 10.10.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Вот мои пояснения к тому, что я пыталась сделать:
Код

def zamena(self, file1, file2):
        """self написала, т.к. функция принадлежит классу, кажется это обязательно, но не уверена
        эта функция - часть программы........ опять-таки если мне нужна функция, 
        обязательно ли создавать класс?"""
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()    # не знала, что файл не надо закрывать, чтобы переоткрыть его в режиме записи
        f1=open(file1, "w")
        f2=open(file2, "w")
        k=0    #использую для счетчика блоков, 1й блок в 1й файл, остальные во 2й
        for line in list:
            i=1
            for x in line:
                """этот цикл использую только для того чтобы определить 1й символ строки
                     если буква К, значит эта строка - начало очередного блока"""
                if ord(x) == 138 and i == 1:
                    k+=1
                    i+=1
                else:
                    i+=1
            if k == 1:
                f1.write(line)
            else:
                f2.write(line)        
        f1.close()           
        f2.close()
        return None    #тоже думала, что return должен завершать функцию

PM MAIL ICQ   Вверх
setq
Дата 10.10.2006, 14:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Создавать класс необязательно.

Код

def f():  # просто функция
    ...


Файлы можно явно не закрывать (если конечно это не JPython).

Что делает твой код, я не понимаю. Кроме того, что исходный файл весь прочитывается в память, а она, как сказал классик, не резиновая.

Успехов.
  Вверх
proDiva
Дата 10.10.2006, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Цитата(setq @  10.10.2006,  14:58 Найти цитируемый пост)
исходный файл весь прочитывается в память

а как по-другому запомнить его содержимое?
PM MAIL ICQ   Вверх
setq
Дата 10.10.2006, 16:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну никак в общем. Либо в память, либо в другой файл. Возможно, что задачу, о которой идёт речь в первом посте, проще решить с помощью модуля mmap, но автор уже наверно нашёл решение (судя по галке).
  Вверх
proDiva
Дата 10.10.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



а можно как-нибудь упростить этот вложенный цикл? он нужен только для определения первого символа строки.... может лучше представить строку списком и вытащить первый символ? хотя в количестве строк кажется оба способа равноценны smile 
PM MAIL ICQ   Вверх
proDiva
Дата 10.10.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Модераторам:
Спасибо за выделение темы. Еще вопрос: нельзя вернуть мой статус новичка?)) Чё-то я себя еще не ощущаю "шустрым" smile 
В очередной раз извиняюсь за оффтоп...... ну не могут девушки не отвлекаться от основной темы разговора)))
PM MAIL ICQ   Вверх
setq
Дата 11.10.2006, 00:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(proDiva @  10.10.2006,  16:49 Найти цитируемый пост)
а можно как-нибудь упростить этот вложенный цикл?


Убрать его) Вам для проверки нужен только первый символ сторки? Воспользуйтесь line[0].
  Вверх
Cr@$h
Дата 11.10.2006, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(proDiva @  10.10.2006,  20:24 Найти цитируемый пост)
Еще вопрос: нельзя вернуть мой статус новичка?)) Чё-то я себя еще не ощущаю "шустрым"

Только божей волей это возможно, но есть вариант, посмотри.
Да, теперь proDiva шустрый  smile Ничего, это тоже хорошо.
PM MAIL ICQ   Вверх
FunnyFalcon
Дата 11.10.2006, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 27.3.2006

Репутация: 4
Всего: 7



Код

def zamena(self, file1, file2):
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()
        f1=open(file1, "w")
        f2=open(file2, "w")
        k=0
        for line in list:
            if line[0] == 'К':
                k+=1
            if k==1:
                f1.write(line)
            else:
                f2.write(line)        
        f1.close()           
        f2.close()

f.close() не убирай! Мало ли на каком питоне будешь програмировать, а JPython, IronPython не считают ссылки, и фаил еще долго открытым валяться будет.

Еще вариант:
Код

def zamena(self, file1, file2):
        f1=open(file1, "r")
        list=f1.readlines()
        f1.close()
        f1=open(file1, "w")
        f2=open(file2, "w")
        it, line = list.iter(), None
        for line in it:
              if line[0]=='К':
                   break
              f2.write(line)
        f1.write(line)
        for line in it:
              if line[0]=='K':
                  break
              f1.write(line)
        f2.write(line)
        f2.writelines(it) 
        f1.close()           
        f2.close()
        return None


PM MAIL   Вверх
proDiva
Дата 11.10.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Я нашла другой вариант:
Код

def zamena(self, file1, file2):
    f1=open(file1, "r")
    list=f1.readlines()
    f1=open(file1, "w")
    f2=open(file2, "w")
    numb=map(list.index, [line for line in list if ord(line[0]) == 138])
    k=numb[1]
    f1.writelines([line for line in list[:k]])
    f2.writelines([line for line in list[k:]])
    f1.close()
    f2.close()

Парни, ну теперь Вы можете сказать, что стиль функционального программирования выдержан?))

Это сообщение отредактировал(а) proDiva - 11.10.2006, 12:06
PM MAIL ICQ   Вверх
pythonwin
Дата 11.10.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(Cr@$h @  11.10.2006,  08:17 Найти цитируемый пост)

Только божей волей это возможно, но есть вариант, посмотри.
Да, теперь proDiva шустрый  smile Ничего, это тоже хорошо. 

и сколько раз в год можно менять статус, если есть 2000 постов?

Добавлено @ 12:28 
Цитата(setq @  10.10.2006,  23:21 Найти цитируемый пост)
Ну никак в общем. Либо в память, либо в другой файл. Возможно, что задачу, о которой идёт речь в первом посте, проще решить с помощью модуля mmap, но автор уже наверно нашёл решение (судя по галке).


можно и компромис - первый блок в переменную, а все остальное в во второй файл, а потом очистить первый файл и записать в него переменную. smile
PM WWW GTalk Jabber   Вверх
proDiva
Дата 11.10.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Цитата(pythonwin @  11.10.2006,  12:26 Найти цитируемый пост)
можно и компромис - первый блок в переменную, а все остальное в во второй файл, а потом очистить первый файл и записать в него переменную. 

Ну а на фига в данном случае такие усилия? Входящий файл не такой большой. С памятью ничего страшного не случится из-за каких-то 60-ти строчек, и побольше сохраняли)))
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.