Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/41: Рейтинг темы: голосов - 41, средняя оценка - 4.66
95 / 1 / 1
Регистрация: 01.08.2011
Сообщений: 35

Правильная работа с файлами

01.08.2011, 15:48. Показов 8416. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я написал небольшой скрипт, который разбирает текстовый файл со строками (разделенными табуляциями) в виде html, проводит небольшую их обработку и генерирует html, который собственно и нужен на выходе.

Также приходится открывать много файлов, с исходными данными на чтение, и 3 на запись (один - html, второй - просто текстовый, третий - результаты обработки (что-то врдое лога, только для других целей)).

В результате получилось очень много try-except-else-finally блоков, которые вложены друг в друга.
На мой взгляд это выглядит немного громоздко и некрасиво! К тому же эти вложенные блоки сдвигают код вправо, так что строки даже не помещались в IDLE, что не очень удобно с точки зрения разработки.

Есть ли какой-нибудь способ, как можно от этого избавиться от вложенных try-except-else-finally блоков?

Там где есть возможность, я просто читал файлы в словарь в памяти, и такие try-except-else-finally блоки расположены в колонку, что уже выглядит получше, но тоже не фонтан.

Я знаю про конструкцию with. Но в моем коде происходит анализ всех ошибок открытия файла через try-except-else-finally блок, а with не позволяет обработать исключения (он просто файл закроет в случае ошибок обработки и все, а мне нужно еще сделать некоторые действия перед этим (вывод на экран для визуального контроля выполнения скрипта)).

Да, опыта написания на Питоне у меня большого нет, хотя я прочитал много документации по этому языку.
Поэтому любые замечания по коду приветствуются.

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
56
57
58
59
60
61
62
63
64
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# -*- coding: utf-8 -*-
import re
import codecs
import sys
from pprint import pprint
 
f_exclusions_name = 'words_posted2.txt' #file with words to exclude
f_exclusions_name2 = 'words_I_want_to_exclude_3.txt' #file with words I want to exclude
file_in_name = 'anki_out3.txt' #input file name
file_out_htm_name = 'out3.htm' #output html file name
file_out_txt_name = 'out3.txt'#output txt file name
word_to_exclude_next_time_file_name = 'words_posted3.txt'
 
html_head = u'''
<html>
 <head>
 <title>Words list 3</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 </head>
 <body>
'''
 
 
to_exclude_dict = {} #dict of words to exclude
excluded_words_dict = {} #dict of excluded words
word_to_exclude_next_time_dict = {}
 
#Forming to_exclude_dict dictionary
try:
    f_exclusions = codecs.open(f_exclusions_name,encoding='UTF-8')
except IOError:
    print('Can\'t open the file {0}'.format(f_exclusions_name))
    sys.exit(1)
else:
    for line in f_exclusions:
        line = line.rstrip('\n\r ')
        to_exclude_dict[line] = True
finally:
    f_exclusions.close()
 
try:
    f_exclusions = codecs.open(f_exclusions_name2,encoding='UTF-8')
except IOError:
    print('Can\'t open the file {0}'.format(f_exclusions_name2))
else:
    for line in f_exclusions:
        line = line.rstrip('\n\r ')
        to_exclude_dict[line] = True
finally:
    f_exclusions.close()
 
 
 
try:
    f_in = codecs.open(file_in_name,encoding='UTF-8')
except IOError:
    print('Can\'t open the file {0}'.format(file_in_name))
else:
    try:
        f_out_htm = codecs.open(file_out_htm_name,mode='w',encoding='UTF-8')
    except IOError:
        print('Can\'t open the file {0}'.format(file_out_htm_name))
    else:
        try:
            f_out_txt = codecs.open(file_out_txt_name,mode='w',encoding='UTF-8')
        except IOError:
            print('Can\'t open the file {0}'.format(file_out_txt_name))
        else:
            try:
                word_to_exclude_next_time_file = codecs.open(word_to_exclude_next_time_file_name,mode='w',encoding='UTF-8')
            except IOError:
                print('Can\'t open the file {0}'.format(word_to_exclude_next_time_file_name))
            else:
                f_out_htm.write(html_head)
                f_out_htm.write(u'<table border="1" cellspacing ="0" cellpadding ="3" width="100%">')
                f_out_htm.write(u'<tr>')
                f_out_htm.write(''.join((u'<th>',u'№',u'</th><th>',u'Слово',u'</th><th>',u'Значение',u'</th>')))
                f_out_htm.write(u'</tr>\n')
 
                pattern1 = re.compile(r'\t')
                pattern2 = re.compile(r'</?span.*?>|^ +| +$|\n')
                pattern3 = re.compile(r'<img src="(.*?)" />')
 
                i = 0
                for j, line in enumerate(f_in):
                    #print(u'Line in: {0}\n'.format(line))
 
                    strings = pattern1.split(line)
 
                    word = pattern2.sub('',strings[0]) #striped of html-garbage string[0]
 
                    word_to_exclude_next_time_file.write(word+u'\n')
                    #print(u'Word: {0}'.format(word))
 
 
                    #Adding the found values in the to_exclude_dict into the excluded_words_dict
                    if word in to_exclude_dict:
                        #print(u'Excluded: {0}\n'.format(word))
                        excluded_words_dict[word] = True
                        continue #no parsing for the data which is in the to_exclude_dict
 
                    f_out_txt.write(word+'\n')
 
                    f_out_htm.write(u'<tr>')
                    i += 1 #number of the table row
                    line = u'<td>'+'{0}'.format(i)+'</td><td>'+strings[0]+u'</td>'+u'<td>'
 
                    definition = strings[2]
                    image = pattern3.search(definition)
                    if image:
                        #print(u'Image detected: {0}'.format(image.group(0)))
                        #adding my public DropBox address
                        definition = pattern3.sub(u'<img style="border:5px solid white" src="http://dl.dropbox.com/u/7801003/Different.media/\g<1>" width="50%" />',strings[2])
                        #print(u'Replaced definition string: {0}\n'.format(definition))
 
                    if definition: #there may be no definition
                        line += definition
                    else:
                        line += '&nbsp' #otherwise the cells are empty and have no borders in the html
 
                    #Adding examples
                    if strings[3]: #there may be no examples
                        line += u'<p><span style="color:blue; font-style:italic;">'+strings[3]+u'</span></p>'
 
                    line += u'</td>'
 
                    f_out_htm.write(line)
                    f_out_htm.write(u'</tr>\n')
 
                f_out_htm.write(u'</table>')
            finally:
                word_to_exclude_next_time_file.close()
        finally:
            f_out_txt.close()
    finally:
        f_out_htm.close()
finally:
    f_in.close()
 
#the set of words which haven't been excluded for some reason
not_excluded = set(to_exclude_dict) - set(excluded_words_dict)
print(u'\nWords that haven\'t been excluded:'.format(word))
for word in not_excluded:
    print(u'{0}'.format(word))
 
print('\nParsing completed')
Спасибо всем откликнувшимся
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.08.2011, 15:48
Ответы с готовыми решениями:

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

Работа со списками и файлами (Двусвязный список, структуры, работа с файлами)
1. Организовать ввод данных структуры и их вывод на экран. 2. Организовать ввод данных структуры из файла и их выгрузку в файл. 3....

Работа с ActiveX семисегментнный индикатор. не правильная работа
Есть проект ActiveX семисегментнный индикатор. но сами семисегментники загораются не понятно по какому закону((( помогите пожалуйста

23
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.08.2011, 17:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от bestol Посмотреть сообщение
Я так тоже пробовал. Даже сделал все в одну строку. Не работает.
ты точно все правильно сделал? После обратного слеша не должно быть пробела. Вводишь символ обратного слеша, после этого сразу же нажимешь Enter. Эта фича не должна быть зависима от версии интерпретатора, она относится к самому чтению тектовых файлов:
Code
1
2
3
4
5
[nameless@desktop ~]$ echo "foo\
> bar\
> baaz" >> pseudo-multiline-file
[nameless@desktop ~]$ cat pseudo-multiline-file 
foobarbaaz
Но даже если (каким-то чудом), эта фича не работает в 2.6, то в 2.7 она точно работает:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[nameless@desktop python]$ cat foo.py
#!/usr/bin/env python
 
try:
    with open('/dev/urandom', 'rb') as random_file, \
         open('missing-file') as missing_file:
        pass
except IOError as e:
    print("Can't open file `{}'".format(e.filename))
[nameless@desktop python]$ chmod +x foo.py
[nameless@desktop python]$ python --version
Python 2.7.1
[nameless@desktop python]$ ./foo.py 
Can't open file `missing-file'
[nameless@desktop python]$
0
95 / 1 / 1
Регистрация: 01.08.2011
Сообщений: 35
01.08.2011, 17:42  [ТС]
ты точно все правильно сделал (после обратного слеша не должно быть пробела.
Я это знаю.
Я пробовал в одну строку (без перевода строк).
Такой синтаксис не работает до Python 2.6 включительно. Это же было написано в документации (я там выше ссылку дал).
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.08.2011, 17:44
Цитата Сообщение от bestol Посмотреть сообщение
Такой синтаксис не работает до Python 2.6 включительно. Это же было написано в документации (я там выше ссылку дал)
И правда, не заметил
0
95 / 1 / 1
Регистрация: 01.08.2011
Сообщений: 35
01.08.2011, 17:53  [ТС]
Проверил.
Дело было в весрии Python. В 2.7 все заработало отлично.

Спасибо!

Добавлено через 1 минуту
Вот окончательная выжимка того, к чему мы пришли:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try:
    with codecs.open(file_in_name,encoding='UTF-8') as f_in,\
    codecs.open(file_out_htm_name,mode='w',encoding='UTF-8') as f_out_htm,\
    codecs.open(file_out_txt_name,mode='w',encoding='UTF-8') as f_out_txt,\
    codecs.open(word_to_exclude_next_time_file_name,mode='w',encoding='UTF-8') as word_to_exclude_next_time_file:
        processing()
except IOError as err:
    if err.filename == file_out_htm_name:
        # do something
    elif err.filename == file_in_name:
        # do something
    elif err.filename == file_out_txt_name:
        # do something
    elif err.filename == word_to_exclude_next_time_file_name:
        # do something
    else:
        print("Something is really wrong going here. Have a closer look on it!")
Весь код вынесен в processing. Но в принципе тут его можно прямо вместо processing() вставить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2011, 17:53

Правильная работа с БД
У меня есть небольшое приложение в котором реализованы функции выборки данных из БД (select ...), изменение записи (update ...) и сейчас...

Правильная работа с БД
и постоянно встречаю сто после запроса соединение надо закрывать как тут например: mysql_query(&quot;CREATE TABLE _myTable ( id...

Работа с файлами , хотелось бы с windows system файлами
всем привет, нужна интересная идея по программированию, работа с файлами , хотелось бы с windows system файлами, у вас есть какая-то идея?...

Не правильная работа listview
Здравствуйте! Вывожу в listview элементы с checbox При нажатии на checkbox что его отметить, элемент отмечается, но тут же перестает...

Не правильная работа TSOP1738
Работаю с TSOP1738. Написал тестовую программу: #ymstude &lt;avr/io.h&gt; #ymstude &lt;avr/interrupt.h&gt; #defyme F_CPU 8000000 int main...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Генератор паролей
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе. Самым главным критерием для меня было создание паролей, в котором отсутствуют знаки: | 1 l I Обработка содержит реквизиты: -. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru