С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
95 / 90 / 17
Регистрация: 05.08.2021
Сообщений: 430

Почему мой код при первом запуске делает с файлом то что от него требуют, но при повторном запуске стирает файл?

24.08.2023, 04:42. Показов 1120. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Цель такова: имеем например такую строку
Василий|||Сидоров||не указано
Из нее нужно получить строчку в формате
Василий|Сидоров|не указано|не указано|не указано|не указано|
Что бы количество элементов которые стоят между сепапараторами | было кратно 6 и сепаратор | не повторялся.
При первом запуске это и получаем, скрипт перезаписывает в файле
Василий|||Сидоров||не указано
на нужное
Василий|Сидоров|не указано|не указано|не указано|не указано|
Но при повторном запуске всё стирает из файла
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
save = ''
 
 
def test_file_for_valid_format():
    def test_string_has_right_format(x):
        return not bool(len(x.split('|')[:-1]) % 6)
 
    with open('objects.txt', encoding='utf-8') as file:
        s = file.read()
        if test_string_has_right_format(s):
            return
        if s:
            if s[-1] != '|':
                s += '|'
            new_n = []
            for i in range(len(s) - 1):
                if s[i] != '|' or (s[i] == '|' and s[i - 1] != '|'):
                    new_n += s[i]
            new_s = ''.join(new_n)
            if new_s[-1] != '|':
                new_s += s[-1]
            if new_s[-1] != '|':
                new_s += '|'
            s = new_s
            n = s.split('|')
            r = len(n[:-1])
            if not r % 6 == 0:
                i = r
                while i % 6:
                    i += 1
                res = i - r
                for i in range(res):
                    s += 'не указано|'
    return s
 
 
save = test_file_for_valid_format()
print(save)
 
 
def change_file_for_valid():
    with open('objects.txt', 'w', encoding='utf-8') as file:
        file.write(save)
 
 
change_file_for_valid()
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.08.2023, 04:42
Ответы с готовыми решениями:

Что надо сделать, чтобы при запуске программы и при первом запуске SaveDialog открывался заданный по умолчанию каталог?
Здравствуйте ВСЕ ! Проблема следующая. 1) При первом запуске SaveDialog открывается каталог с файлами. 2) Изменяешь каталог,...

Почему программа выдает ошибку при первом запуске, а дальше работает нормально? Код C
Подскажите почему программа выдает ошибку при первом запуске, а дальше работает нормально? #include <iostream> #include...

Стал сильно нагреваться блок питания но только при первом запуске и вырубает комп , при втором запуске работает норм
поставил новую видюху Geforce GTX 560 ti и стал сильно нагреваться блок питания но только при первом запуске и вырубает комп , при втором...

7
Заблокирован
24.08.2023, 05:58
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
стирает файл?
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
with open('objects.txt', 'w', encoding='utf-8') as file:
всякий раз новый
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
24.08.2023, 08:17
Ну, так можно:
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
from random import randint
 
GOOD_SEP = '|'
GOOD_COUNT = 6
def format_str(line):
    elements = [e for e in line.split(GOOD_SEP) if e]
    if not elements:
        return ''
    list = [elements[-1]]*(GOOD_COUNT - len(elements)%GOOD_COUNT)
    elements.extend(list)
    return GOOD_SEP.join(elements) + GOOD_SEP
 
def make_word():
    is_sep = randint(0,1)
    if is_sep:
        return GOOD_SEP
    else:
        return chr(randint(ord('a'),ord('z'))) * randint(1,7)
 
def make_line():
    count = randint(1,10)
    return (''.join([make_word() for _ in range(count)]))
 
def fill_in_file(fname):
    LINE_COUNT = 10
    lines = [make_line()+'\n' for _ in range(LINE_COUNT)]
    open(fname, 'w').writelines(lines)
 
filename = 'f.txt'
 
fill_in_file(filename)
print(f'Исходное содержимое файла {filename}:')
print(open(filename).read())
 
lines = [x for x in open(filename).readlines()]
lines = [format_str(line[:-1]) for line in lines]
lines = [x for x in lines if x]
 
open(filename, 'w').write('\n'.join(lines))
 
print(f'Результирующее содержимое файла {filename}:')
print(open(filename).read())
0
95 / 90 / 17
Регистрация: 05.08.2021
Сообщений: 430
24.08.2023, 08:57  [ТС]
Спасибо конечно, но это полностью другое решение. А мне бы разобраться в проблеме в своем коде. Цель всё же учебная
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
24.08.2023, 10:17
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
А мне бы разобраться в проблеме в своем коде. Цель всё же учебная
Ну, чем дорабатывать плохое решение, в котором вы сами ничего не понимаете, лучше написать новое хорошее, а для этого не грех почитать и чужие толковые решения.
0
95 / 90 / 17
Регистрация: 05.08.2021
Сообщений: 430
24.08.2023, 10:48  [ТС]
Да нет, понимаю... Проблема не такой уж и большой была
Python
1
2
if test_string_has_right_format(s):
            return s
Вот и первый шаг в нужную сторону...
0
95 / 90 / 17
Регистрация: 05.08.2021
Сообщений: 430
25.08.2023, 04:25  [ТС]
И никакое это не "плохое решение". Заработало, и делает именно то что нужно мне, без всяких ненужных здесь фантазий про random и прочее подобного
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
save = ''
 
 
def test_file_for_valid_format():
    def test_string_has_right_format(x):
        return not bool(len(x.split('|')[:-1]) % 6) and '|' in x
 
    with open('objects.txt', encoding='utf-8') as file:
        s = file.read()
        if s:
            if s[-1] != '|':
                s += '|'
            if test_string_has_right_format(s):
                return s
            if s[-1] != '|':
                s += '|'
            new_n = []
            for i in range(len(s) - 1):
                if s[i] != '|' or (s[i] == '|' and s[i - 1] != '|'):
                    new_n += s[i]
            new_s = ''.join(new_n)
            if new_s[-1] != '|':
                new_s += s[-1]
            if new_s[-1] != '|':
                new_s += '|'
            s = new_s
            n = s.split('|')
            r = len(n[:-1])
            if not r % 6 == 0:
                i = r
                while i % 6:
                    i += 1
                res = i - r
                for i in range(res):
                    s += 'не указано|'
            return s
        else:
            print('file is empty')
 
 
 
save = test_file_for_valid_format()
print(save)
 
 
def change_file_for_valid():
    with open('objects.txt', 'w', encoding='utf-8') as file:
        file.write(save)
 
 
change_file_for_valid()
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
25.08.2023, 05:38
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
И никакое это не "плохое решение". Заработало
Поздравляю!
Но если работает - это еще не означает, что решение хорошее. Самый главный критерий - это понятность и читаемость программы. У новичков обычно с этим туго. Ну а если программа понятная, то ее и тестировать легко и ошибки в ней находить.
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
про random
Ну, рандом там для тестирования. Не вручную же вводить многие строки...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2023, 05:38
Помогаю со студенческими работами здесь

Создать файл настроек при первом запуске программы
Подскажите как на C# сделать так, чтобы при первом запуске программы автоматически создавался файл с настройками (MyProgram.exe.config) ?

Файл при запуске по двойному щелчку мыши не работает как при запуске в терминале
Есть текстовый файл Goodgame.sh с таким кодом: xclip -o > clipboard.txt file="/home/user/clipboard.txt" while read line do #...

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

При первом нажатии кнопки - выполнялся один код,при повторном другой и тд
Имеется код : document.onkeydown = function(z) { if (z.keyCode=="120") { var h = document.getElementsByTagName('a'); ...

Как скопировать готовый файл в директорию на android при первом запуске, с дальнейшим использованием?
Нужно скопировать готовый файл(с данными) на android при первом запуске, для дальнейшего его использование на телефоне?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru