Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/20: Рейтинг темы: голосов - 20, средняя оценка - 4.90
исследователь
325 / 104 / 3
Регистрация: 18.03.2010
Сообщений: 1,079
Записей в блоге: 2
1

Траблы при записи в текстовый файл (append)

26.07.2011, 17:50. Показов 4129. Ответов 8

Author24 — интернет-сервис помощи студентам
Сделал несложный скриптик.
Собирает нужную мне информацию с веб-страниц, точнее отслеживает ее изменение.
Проблема в том что неправильно идет дополнение данных в текстовом файле
Python
1
2
3
4
fl=open(statuslogfile, 'a')                                 # открываем файл лога (журнала) для добавления
.......................................
fl.write(log)                                                                     # записываем
fl.write('\n')                                                                    # вставляем разрыв строки
Проблема в том что во время работы скрипта в NetBeabs он вообще ничего не записывает,
а в консоли записывает все сразу при остановке скрипта например из за ошибки или если я нажму Ctrl+C
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2011, 17:50
Ответы с готовыми решениями:

Дозапись в текстовый файл без функции append
Здравствуйте. Проблема в следующем.Append - открывает, ищет конец, записывает. Возник вопрос, как...

Что можно сказать о равенстве значений следующих выражений: (append x (append y z) (append (append x y) z)
помогите, пожалуйста!! 1)Что можно сказать о равенстве значений следующих выражений: (append x...

Ругань при записи в текстовый файл
Беда случилась. Голова кругом, то переписывает в документ то ошибка 102 то ошибка 32. Соль:...

Странности при записи в текстовый файл
здравствуйте, есть код Sub С() Const vbs_files = "D:\ДНСД\ДНСД.vbs" 'путь к файлу...

Сохранение формата при записи в текстовый файл
Привет! Написала код в java, который работает с текстовым файлом: читает выбранный файл, находит...

8
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
27.07.2011, 03:29 2
Не совсем понятно, чего Вы хотите. Что должно произойти, если возникла ошибка? А если пользователь нажал Ctrl+C? Как работает скрипт, запускается периодически или постоянно висит в памяти?
0
исследователь
325 / 104 / 3
Регистрация: 18.03.2010
Сообщений: 1,079
Записей в блоге: 2
27.07.2011, 03:34  [ТС] 3
Цитата Сообщение от pyuser Посмотреть сообщение
Не совсем понятно, чего Вы хотите. Что должно произойти, если возникла ошибка? А если пользователь нажал Ctrl+C? Как работает скрипт, запускается периодически или постоянно висит в памяти?
Что бы не усложнять скрипт передачей параметров (самому себе) организован бесконечный цикл. И этот фрагмент находится внутри этого цикла.
Я тут подумал может надо каждый раз перед началом записи в файл его открывать и после записи закрывать?!
Алгоритм такой.
1. Парсятся веб-страницы
2. извлекаются и обрабатываются нужные данные
3. сравниваются с прошлыми такими же данными
4. запись в лог файл об произошедших изменениях
5 переход к пункту 1
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
27.07.2011, 03:45 4
Что-то подсказывает мне, что Вы просто не видите изменений файла по ходу работы скрипта, так?
В этом случае можно воспользоваться Вашим же предложением, открывать файл перед записью и закрывать после. Все зависит от того, как часто происходит запись. Можно после каждой записи в файл принудительно сбрасывать буфер (у файлового объекта есть метод flush)
1
исследователь
325 / 104 / 3
Регистрация: 18.03.2010
Сообщений: 1,079
Записей в блоге: 2
27.07.2011, 04:08  [ТС] 5
Но есть другой такой же файл, туда идет запись каждую минуту и все окей, тоже в режиме append

Добавлено через 3 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# ---- если смена статуса произошла, то выдаем notify и записываем в log ------
            if cstatus<>pstatus and flagnew<>1:                                 #
                ts=email + ' now is '                                           #
                if cstatus==1:                                                  #
                    ts=ts + 'online'                                            # пользователь теперь online
                if cstatus==0:                                                  #
                    ts=ts + 'offline'                                           # пользователь теперь offline
                xdate=datetime.datetime.now()                                   # получаем дату
                xdate= xdate.strftime('%d.%m.%Y %H:%M:%S')                      # форматируем
                log=xdate +' : ' + ts                                           # для дополнения
                notify=xdate[12:]                                               # подготавливаем
                notify=xdate + ' : ' + ts                                       # уведомление
                print notify                                                    # печать уведомления
                from wave import open as waveOpen
                from ossaudiodev import open as ossOpen
                s = waveOpen(notifysoundfile,'rb')
                (nc,sw,fr,nf,comptype, compname) = s.getparams( )
                dsp = ossOpen('/dev/dsp','w')
                try:
                    from ossaudiodev import AFMT_S16_NE
                except ImportError:
                    if byteorder == "little":
                        AFMT_S16_NE = ossaudiodev.AFMT_S16_LE
                    else:
                        AFMT_S16_NE = ossaudiodev.AFMT_S16_BE
                dsp.setparameters(AFMT_S16_NE, nc, fr)
                data = s.readframes(nf)
                s.close()
                dsp.write(data)
                dsp.close()                                                                  #
                fl.write(log)                                                   # записываем
                fl.write('\n')                                                  # вставляем разрыв строки
            i=i+1                                                               #
        flagnew=0                                                               #
# ------------------------------- четвертый этап --------------------------------
        i=0
        while i<counter:
            maillist_pstatus[i]=maillist_status[i]                              # записываем
            i=i+1
# ------------------------------- пятый этап ------------------------------------
        cdate=datetime.datetime.now()                                           # получаем дату
        cdate= cdate.strftime('%d.%m.%Y %H:%M')                                 # форматируем
        if cdate<>pdate:                                                        # сравнение дат, старой и новой
            pdate=cdate                                                         #
            sl=open(statuslistfile, 'a')                                        # дополнение информации (каждую минуту)
            sl.write(cdate)                                                     # записываем дату
            i=0                                                                 # сбрасываем счетчик
            sl.write(' ')                                                       # вставляем разделительный пробел
            while i<counter:                                                    # цикл
                mystatus=maillist_status[i]                                     # статус
                mystatus=str(mystatus)                                          # преобразуем в текстовый вид
                sl.write(mystatus)                                              # записываем
                i=i+1                                                           # инкрементируем
            sl.write('\n')                                                      # вставляем разрыв строки
        time.sleep(5)                                                       # пауза 5 секунд
Я конечно не очень хорошо умею программировать на Python
но вот этот фрагмент работает нормально
Python
1
 sl.write(mystatus)                                              # записываем
Добавлено через 13 минут
Даже если журнальный файл каждый раз открывать-закрывать все равно ничего в него не записывается
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
27.07.2011, 04:51 6
Я несколько сократил Ваш код (по оформлению кода почитайте pep-008)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 # все импорты выносим в начало модуля
from wave import open as waveOpen
from ossaudiodev import open as ossOpen
 
try:
    from ossaudiodev import AFMT_S16_NE
except ImportError:
    if byteorder == "little":
        AFMT_S16_NE = ossaudiodev.AFMT_S16_LE # не имеет смысла :( (нет модуля ossaudiodev)
    else:
        AFMT_S16_NE = ossaudiodev.AFMT_S16_BE # не имеет смысла :( (нет модуля ossaudiodev)
 
    # в Вашем коде не увидел открытия лог-файла, поэтому добавил
    with (open(log_file_name, "a")) af fl:
# ---- если смена статуса произошла, то выдаем notify и записываем в log ------
            if cstatus != pstatus and not flagnew:
                cdate = datetime.datetime.now()
                ts = "{0} now is {1}".format(email, "online" if cstatus else "offline")
                print "{0} : {1}".format(cdate.strftime("%M:%S"), ts)  # печать уведомления
                with waveOpen(notifysoundfile,'rb') as s, ossOpen('/dev/dsp','w') as dsp:
                    (nc,sw,fr,nf,comptype, compname) = s.getparams( )
                    dsp.setparameters(AFMT_S16_NE, nc, fr)
                    data = s.readframes(nf)
                    dsp.write(data)
                fl.write("{0} : {1}\n".format(cdate.strftime('%d.%m.%Y %H:%M:%S'), ts))
                fl.flush()
            i += 1                                                                #
        flagnew = 0                                                               #
# ------------------------------- четвертый этап --------------------------------
        maillist_pstatus[:] = maillist_status[:]
# ------------------------------- пятый этап ------------------------------------
        cdate=datetime.datetime.now() 
        if cdate != pdate: # сравнение дат, старой и новой
            pdate = cdate             
            with open(statuslistfile, 'a') as sl:
                status_line = "".join(str(x) for x in maillist_status)
                sl.write("{0} {1}\n".format(cdate.strftime('%d.%m.%Y %H:%M'), status_line))
        time.sleep(5)                                                       # пауза 5 секунд
проверить, по понятным причинам не могу - пробуйте
1
исследователь
325 / 104 / 3
Регистрация: 18.03.2010
Сообщений: 1,079
Записей в блоге: 2
27.07.2011, 08:12  [ТС] 7
Python
1
 with (open(statuslogfile, "a")) af fl:
SyntaxError: invalid syntax

Что не так в этой строке?!
Мне не важно сейчас оформление кода, я для себя делаю, лишь бы скрипт только работал.
А выражения типа i += 1 я вообще традиционно не приемлю


Добавлено через 52 минуты
Вот на этой строке
Python
1
maillist_pstatus[:]=maillist_status[:]
когда я запускаю скрипт в консоли тоже выдает ошибку!
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
27.07.2011, 10:14 8
Скобки лишние , должно быть
Python
1
with open(statuslogfile, "a") as fl:
но ошибка не в этом, а в том, что вместо AS Вы написали AF

можете показать ошибку? У меня все работает
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
In [1]: l1 = [1, 2, 3]
 
In [2]: l2 = [2, 3]
 
In [3]: l2[:] = l1[:]
 
In [4]: l2
Out[4]: [1, 2, 3]
 
In [5]: l2[1] = 10
 
In [6]: l1
Out[6]: [1, 2, 3]
 
In [7]: l2
Out[7]: [1, 10, 3]
1
исследователь
325 / 104 / 3
Регистрация: 18.03.2010
Сообщений: 1,079
Записей в блоге: 2
27.07.2011, 11:27  [ТС] 9
После того как я добавил
Python
1
fl.flush()
работать стало нормально.
Но в целом я вернулся к тому варианту который был у меня изначально.
0
27.07.2011, 11:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2011, 11:27
Помогаю со студенческими работами здесь

Определить кодировку при записи в текстовый файл
Выдает, что gedit не может определить кодировку при записи в текстовый файл. Как это исправить...

Перевод строк при их записи в текстовый файл
Как сделать перевод строк при их записи в текстовый файл (CArchiv::WriteString())? не подойдет,...

Не работает перенос строки при записи в текстовый файл
у меня есть 4 переменные: f=24; f2=37; Bf=20; Bf2=59; Мне нужно из записать в текстовый файл...

Деление на ноль при записи массива в текстовый файл
Добрый день! Нужно из маткада перенести значения в текстовый документ, график строится, но при...

Указать кодировку при записи событий в текстовый файл
Сообщения об ошибках добавляются в поле Memo и затем по кнопке сохраняются в файл:...

Форматирование строк для записи в файл. Функция append() и циклы
Добрый вечер! С питоном начала разбираться совсем недавно и у меня возникла проблема при записи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru