Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/75: Рейтинг темы: голосов - 75, средняя оценка - 4.52
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533

Добавление нескольких файлов для последующего редактирования

03.09.2019, 12:20. Показов 17349. Ответов 158

Студворк — интернет-сервис помощи студентам
Доброго времени суток форумчане! Не так давно, благодаря знатокам из данного форума была написана (спасибо за всё) программа. Суть её в следующем: На диске лежат файлики в которых 20 строк, каждую десятую строку программа вставляет пустую строку, затем копирует содержимое 10-й строки, добавляет перед пустой строкой (проще говоря дублирует 10-ю строку), затем дублирует 11-ю и добавляет перед 11-й строкой (капец туфтология), наглядно это вот так:

Было:
7
8
9
10
11
12
13

Стало:
7
8
9
10
10

11
11
12
13

И так программка делает каждую 10-ю строку! Строк может быть уйма. Всё работает всё делится, как надо, вопрос таков:
Файлов которые нужно редактировать много, поэтому, я хотелось бы сделать, что-то типа добавления или запоминания нескольких файлов, а затем их сразу переделывать, что каждый раз не указывать файл заново. Файлы лежат в разных папках, поэтому забирать из корня не выйдет. Желательно сделать наглядно, чтобы я уже видел, какие файлики я добавил, а какие нет! Заранее спасибо за помощь!

Собственно и сама программа:
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
from tkinter import *
from tkinter import ttk
import os
 
from tkinter import messagebox
from tkinter import filedialog
 
def update_the_label():
    lb0 = Label(window, text = "-")
 
def clicked_dialogOpen():
    global choosefile
    choosefile=filedialog.askopenfilename(filetypes=(("Text files", "*.txt"), ("all files", "*.*")))
    lb0 = Label(window, text = choosefile)
    lb0.pack(side ="top")
 
def clicked():
    try:
        with open(choosefile, 'r+', encoding='utf-8') as f:
            lines = f.readlines()
            f.seek(0)
            for i in range(int(combo.get())-1, len(lines), int(combo.get())):
                lines[i]+=lines[i][0:21] + "\n\n"
                if i <len(lines)-1:
                    lines[i+1]=lines[i+1][0:21] + " Информация: " + "\n" + lines[i+1]
            f.writelines(lines)
        f.close()      
    except:
        messagebox.showerror("Ошибка", "Дядь, файлик то выбери!")
    messagebox.showinfo("Завершение", "Готова")
 
window = Tk()
window.title("Дырка")
window.geometry('220x400')
window.resizable('false', 'false')
 
lb1 = Label(window, text = "Диапазон строк: ")
lb1.pack(side ="top")
 
combo=ttk.Combobox(window, values=(2,10,50,100,250,500,600,700,800,900,1000), width=28)
combo.current(0)
combo.pack(side ="top")
 
btn3 = Button(window, text = "Обновить список", command = update_the_label, width=26)
btn3.pack(side = "top")
 
btn2 = Button(window, text = "Открыть файл", command=clicked_dialogOpen, width=26)
btn2.pack(side ="top")
 
btn = Button(window, text ="Зарубить", command=clicked, width=26)
btn.pack(side ="top")
 
lb2 = Label(window, text = "_________________________")
lb2.pack(side ="top")
 
lb3 = Label(window, text = "Список отредактированных файлов:")
lb3.pack(side ="top")
 
window.mainloop()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2019, 12:20
Ответы с готовыми решениями:

Сохранить данные из них для последующего просмотра и редактирования
имеется несколько полей в которые заносятся данные. как мне сохранить данные из них для последующего просмотра и редактирования?

Как целиком загрузить таблицу из SQL БД в браузер для последующего её редактирования?
Как целиком загрузить таблицу из SQL БД в браузер для последующего её редактирования?

Добавление картинки через диалоговое окно по кнопке, для последующего сохранения в таблицу
Здравствуйте, в бд имеется таблица с полями Оле. В поля Оле добавляются картинки с изделиями. Создал форму для добавления картинок и...

158
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
12.09.2019, 15:50  [ТС]
Студворк — интернет-сервис помощи студентам
Alli_Lupin, dondublon, поэтому к Вам и обращаюсь. Я знаю, что строка в питониче является неизменяемой.

dondublon, смотрите, я вытягиваю элементы из строки, которая следует после пустой строки(прошу прощение за туфтологию). Выковыриваю я оттуда символы, с 12 по 20 элемент. Мне необходимо, чтобы последний символ который я выкавыриваю (там число от 0 до 10) отличался на 1 единицу.
0
5187 / 1077 / 151
Регистрация: 29.01.2013
Сообщений: 6,269
12.09.2019, 15:54
Damenikx, возьмите 20-й символ, приведите его к целочисленному типу, инкрементируйте. в новую переменную запишите [12:19] + это число.
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
12.09.2019, 16:08  [ТС]
Alli_Lupin, да, я пробовал, но у меня почему-то (понятно почему - потому что тупой) вставляется 21 символ. Если я пытаюсь перевести это в целочисленное, в int, получаю ошибки.
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
12.09.2019, 16:08
Damenikx, окей, а вот эта строка что делает?
Python
1
        for i in range(int(10-1), len(lines), int(10)):
"Следует после пустой строки" - но я не увидел там нигде ни намёка, что строка сравнивается с пустой.
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
12.09.2019, 16:11  [ТС]
Пытался в цикле, но тоже безуспешно. Получилось один раз воткнуть то что надо выше строки и один раз, а не каждый раз, когда появляется строка.

Добавлено через 48 секунд
Цитата Сообщение от dondublon Посмотреть сообщение
"Следует после пустой строки" - но я не увидел там нигде ни намёка, что строка сравнивается с пустой.
Здесь мы определяем, после какой строки будет вставлена пустая строка.
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
12.09.2019, 16:14
Damenikx, то есть пустую строку мы не ожидаем\ищем, а ставим? Тогда вот это неправильно:
из строки, которая следует после пустой строки
ведь этой пустой строки ещё нет.
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
12.09.2019, 16:17  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
ведь этой пустой строки ещё нет.
Именно так, пустую строку мы вставляем после скопированной 10-й строки.

C#
1
lines[i]+=lines[i][12:20] + "\n\n"
Добавлено через 48 секунд
dondublon, я понимаю, что Вас очень тяжело понять эту чушь )) я сам путаюсь
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
12.09.2019, 16:27
Damenikx, я понимаю, что вы не очень знаете Питон, но естественный-то язык вроде должны. Ладно, почитаю исходный пост.
0
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
12.09.2019, 16:32  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Damenikx, я понимаю, что вы не очень знаете Питон, но естественный-то язык вроде должны. Ладно, почитаю исходный пост.
Если писать на "могучем" языке, то получается жуткая туфталогия, поэтому Вам и тяжело для понимания. Я стараюсь, правда!
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
12.09.2019, 16:50
В общем, так. Я понимаю, что тут используются техника, до которой вы ещё не доросли, но если "ничего не трогать", то можно пользоваться.
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
fn = r'd:\temp\forum_d.txt'
 
with open(fn) as f:
    lines = f.readlines()
 
 
def iter_by_chunks(iterlines):
    iterator = iter(iterlines)
    while True:
        try:
            first = next(iterator)
            yield first
            yield first
            for i in range(9):
                last = next(iterator)
                yield last
            yield last
            yield 'empty line'
        except StopIteration:
            return
 
 
for line in iter_by_chunks(lines):
    print(line)
Добавлено через 9 минут
Читать файл и ОДНОВРЕМЕННО в него писать - занятие рискованное, я бы не стал этим заниматься без крайней нужды.
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
13.09.2019, 08:50  [ТС]
dondublon, Спасибо, я всё испробую и отпишусь.

Добавлено через 10 минут
dondublon, хм, не "арбайтен". Я конечно извиняюсь, но я вообще не понимаю кода)) правильно Вы сказали не дошёл ещё. Поэтому я скопипастил и запустил. Но файл не изменился.

Добавлено через 19 минут
Я немного понял. Ваш код меняет строки непосредственно в консоли, выводит весь файл и изменяет, но не меняет файл, который на диске. Я так понимаю дальше самому. Вы сказали, чтобы я ничего не трогал, я думал, что это и есть вся программа. Спасибо, буду разбираться дальше!
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
13.09.2019, 11:14
Damenikx, этот код читает ваши строки (именно строки) и выводит в требуемом виде. Он ничего не "меняет".
Что делать с этим новым содержимым - уже дело ваше. Можете, к примеру, записать в тот же файл, вроде бы, вам это нужно. Но с этим, я думаю, вы уже сами справитесь.
Менять мой код вам и правда не стоит, а вот встроить его в ваш as is - нужно.

Добавлено через 1 минуту
Я имел в виду, менять функцию iter_by_chunks, она тут ключевая. Всё остальное - это так, мелочи, ввод-вывод, с этим можете делать, что хотите.

Добавлено через 2 минуты
Damenikx, и ещё одно замечание.
По словесному описанию, надо удваивать первую и последнюю строку в каждом десятке. Но если так, то к нулевому десятку это тоже относится, и первая строка будет удвоена. Если это не ok - придётся чуть усложнить.
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
13.09.2019, 11:15  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Если это не ok - придётся чуть усложнить
Придётся усложнить)))
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
13.09.2019, 11:18

Не по теме:

Да, кстати, насчёт глобальных и прочих переменных :) Переменные вообще зло. У меня они и не используются :) Разве что i, но и от неё можно избавиться.



Добавлено через 2 минуты
Damenikx,
Придётся усложнить)))
Окей, самый простой способ усложнить - это вручную пропустить эту первую строку:
Python
1
2
3
4
5
iter1 = iter(iter_by_chunks(lines))
next(iter1)
# после этого в iter1 первая строка останется не-удвоеной. 
for line in iter1:
    print(line)
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
13.09.2019, 11:21  [ТС]
Придётся усложнить)))
Цитата Сообщение от dondublon Посмотреть сообщение
Окей, самый простой способ усложнить - это вручную пропустить эту первую строку:
Ясно, спасибо. Теперь я начну танцевать с бубнами дабы собрать всё в кучу)
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
13.09.2019, 11:25
Ладно, бонус. Как сначала считать файл, а записать в него потом.

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
def iter_by_chunks(iterlines):
    iterator = iter(iterlines)
    while True:
        try:
            last = None  # warning
            first = next(iterator)
            yield first
            yield first
            for i in range(9):
                last = next(iterator)
                yield last
            yield last
            yield 'empty line\n'
        except StopIteration:
            return
 
fn = r'd:\temp\forum_d.txt'
 
with open(fn) as f:
    old_content = f.readlines()
 
new_content = iter(iter_by_chunks(old_content))
next(new_content)
with open(fn, 'w') as f:
    f.writelines(new_content)
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
13.09.2019, 16:45  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Ладно, бонус. Как сначала считать файл, а записать в него потом.
Приятный бонус, спасибо!)

Добавлено через 4 часа 57 минут
dondublon, всё работает, но! Там где мы копируем строки между пустой строкой, мне нужна не вся строка, а только определённые элементы из неё [12:20], пытаюсь указать, не получается. Точнее получается но всё идёт к чертям)) да и проблема та же осталась. [12:20] - в этом диапазоне последний элемент ([20]) должен быть на единицу больше. Всё очень тяжело написать я покажу!

То, что должны получить:
....
Я очень Люблю Python 10:20:21
Но он меня не любит 10:20:22
Мы никак не можем понять друг друга 10:20:23
Слёзы по щекам текут 10:20:24
10:20:24 // эту строку мы скопировали перед пустой строкой и оставили в ней только определённые элементы.

10:20:26 // эту строку мы скопировали после пустой строки и оставили в ней только определённые элементы, НО!!!! последняя цифра на 1 больше чем в следующей строки из которой мы это вытащили.
И сопли в рот попадают 10:20:25
Сидим с котом и курим на подоконнике 10:20:26
Слов мне хватает тут что-то написать 10:20:27
Мама говорит, что я красивый 10:20:28
И думаем о нём (о питоне, я не гей) 10:20:29

Исходный файл который надо изменить:
Я очень Люблю Python 10:20:21
Но он меня не любит 10:20:22
Мы никак не можем понять друг друга 10:20:23
Слёзы по щекам текут 10:20:24
И сопли в рот попадают 10:20:25
Сидим с котом и курим на подоконнике 10:20:26
Слов мне хватает тут что-то написать 10:20:27
Мама говорит, что я красивый 10:20:28
И думаем о нём (о питоне, я не гей) 10:20:29

Добавлено через 39 секунд
Я думаю, что смог достучаться до Вас! )

Добавлено через 13 минут
Почти сочинение))
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
13.09.2019, 16:59
Damenikx, много слов, да.
между пустой строкой
Что это значит? "Между" может быть только между двумя или более объектами.
Да и "всё идёт к чертям" не очень информативно.

Преобразование строк - можете сделать, как хотите. Но придётся влезать в ту функцию. Вместо yield first или last, тут уж сами разбирайтесь, поставить что-то вроде
Python
1
yield '{0}{1}'.format(first[12:20], int(first[20])+1)
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
14.09.2019, 09:16  [ТС]
dondublon, спасибо, поэкспериментирую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2019, 09:16

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

Добавление нескольких файлов в БД
Мне надо вывести в бд сразу несколько файлов в форме. сказали что надо преобразовать массив в строку с помощью serialize() чтобы добавить...

Добавление нескольких файлов в бд
Добрый день. Столкнулься с проблемой, так как сам в програмировании пребиваю на начальной стадии обучения прошу совета. Необходимо...

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

Добавление нескольких файлов в OpenFileDialog
Надо сделать чтоб можно было выбрать несколько файлов в OpenDialog Пока вот что сделал, место пути выдаёт OpenFileDialog1. ...


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

Или воспользуйтесь поиском по форуму:
159
Ответ Создать тему
Новые блоги и статьи
Особенности 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,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru