Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 28.05.2023
Сообщений: 10

Разделение файла на части по одинаковому начальным символам строки

29.05.2023, 19:09. Показов 2064. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как с помощью Python разделить текст из файла на несколько файлов, количество строк всегда разное.
Но каждый файл начинается со строки /com,*******

Например первый файл должен содержать содержать следующие строки
/com,*********** Elements for Body 1 "Solid" ***********
et,1,185
eblock,19,solid,,8
(19i9)
1 1 1 1 0 0 0 0 8 0 1 1 22 21 18 2 23 20 19
много однотипных строк
1 1 1 1 0 0 0 0 8 0 8 1 26 15 12 3 4 9 10
-1



Пример файла для скачивания prims.txt
Исходный файл спрятан под спойлер.

Кликните здесь для просмотра всего текста
/wb,elem,start ! set before creation of elements
/com,*********** Elements for Body 1 "Solid" ***********
et,1,185
eblock,19,solid,,8
(19i9)
1 1 1 1 0 0 0 0 8 0 1 1 22 21 18 2 23 20 19
много однотипных строк
1 1 1 1 0 0 0 0 8 0 8 1 26 15 12 3 4 9 10
-1
!Material Id = {DB875B17-57A0-4B13-B6E0-20410295C180}
/com,*********** Elements for Body 2 "Solid" ***********
et,2,185
eblock,19,solid,,16
(19i9)
2 2 2 2 0 0 0 0 8 0 84 488 517 535 535 516 516 516 516
много однотипных строк
2 2 2 2 0 0 0 0 8 0 99 490 524 522 522 537 537 537 537
-1
!Material Id = {33823369-8A08-4DE9-B856-28F7085CB391}
et,3,185
eblock,19,solid,,40
(19i9)
2 3 2 2 0 0 0 0 8 0 100 509 517 519 518 512 535 533 523
много однотипных строк
2 3 2 2 0 0 0 0 8 0 139 492 525 524 495 487 487 487 487
-1
!Material Id = {33823369-8A08-4DE9-B856-28F7085CB391}
/com,*********** Elements for Body 4 "Solid" ***********
et,4,186
keyo,4,2,1 ! set full integration on SOLID186
eblock,19,solid,,75
(19i9)
4 4 4 4 0 0 0 0 20 0 9 28 30 60 58 84 83 68 69
161 173 284 162 344 312 310 314 164 174 292 285
много однотипных строк
4 4 4 4 0 0 0 0 20 0 83 57 59 118 119 99 100 116 117
279 289 417 282 382 386 414 384 281 288 415 416
-1
!Material Id = {69B4A249-CB7D-484E-9A62-1F6A53C4F80C}
/wb,elem,end ! done creating elements
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.05.2023, 19:09
Ответы с готовыми решениями:

Выделение слова из строки по начальным и конечным символам
Фрагменты текста: 1) 2) Код:

Разделение строки по определенным символам
У меня есть переменная состоящая слитно написано слов, разных по длине. На пример так: t= '2мороз1и2солнце1день2чудесный' Нужно...

Разделение строки на элементы, по указанным символам, без использования <string.h>
#include &lt;stdio.h&gt; int main() { char *str = &quot;qtga+agafg+1354&quot;; size_t p = 1; while (*str++ != '\0') { // Перебираем...

14
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
29.05.2023, 19:56
cosmosm, Может быть лучше сразу всю задачу озвучите? А то ведь тут она у Вас по-другому звучала...
1
0 / 0 / 0
Регистрация: 28.05.2023
Сообщений: 10
29.05.2023, 20:15  [ТС]
В том примере я расписал криво. Мне предложили считать n строчек. Но у меня каждый раз разное количество строк.
Предыдущая задача была мной решена так как начало и конец строк всех "nd" и всех строк "el" всегда одинаковое. Поэтому вопрос отделения строк "nd" от строк "el" отпал.
Теперь весь файл "el" требуется разделить на отдельные файлы, в каждом из которых элементы принадлежат одному телу. Но не могу разобраться как разделить файл по началу строки.

PS: далее будет перестановка номеров в каждой строке в зависимости от типа элемента указанного в строке (et,1,185). Требуется для конвертора сетки мкэ из ansys в зенит.

Спасибо.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
29.05.2023, 21:56
Цитата Сообщение от cosmosm Посмотреть сообщение
Но не могу разобраться как разделить файл по началу строки.
Пока всё ещё непонятно, по какой именно строке делить на файлы и по каким критериям отбирать строки, которые будут попадать в выходящие файлы... там не все строки однотипные и структура документа тоже не вполне однотипно выстроена...
Смотрите, если например, строка, предназначенная для разделения на файлы:
Цитата Сообщение от cosmosm Посмотреть сообщение
/com,*********** Elements for Body 1 "Solid" ***********
то какие строки в этот файл будут попадать до следующего разделителя? Или все подряд?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import re
 
fin = 'prims.txt'
nout = 'out' # префикс имен выходных файлов
cnt, flg = 0, False
with open(fin, 'r') as fr:
    for line in fr:
        if re.match(r'/wb,elem', line):
            flg = False
        if re.match(r'/com,', line):
            cnt += 1
            fout = nout + str(cnt) + '.txt'
            flg = True
            with open(fout, "w") as fw:
                fw.write(line)
                fw.flush()
        elif flg:
            with open(fout, 'a') as fa:
                fa.write(line)
                fa.flush()
0
0 / 0 / 0
Регистрация: 28.05.2023
Сообщений: 10
30.05.2023, 06:17  [ТС]
В каждый файл должны попадать строки от строки начинающейся с
/com,*******
до строки в которой содержится
-1
Из приложенного мной файла "prims.txt" должно получится четыре файла.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
30.05.2023, 08:05
Цитата Сообщение от cosmosm Посмотреть сообщение
Из приложенного мной файла "prims.txt" должно получится четыре файла.
Потому и уточнял...
В приложенном Вами файле, всего три строки, начинающиеся с /com,*******, поэтому встречный вопрос:
По каким критериям там может получиться 4 файла?
0
0 / 0 / 0
Регистрация: 28.05.2023
Сообщений: 10
30.05.2023, 22:06  [ТС]
Добрый вечер. Да там действительно будет только 3 строки.
1) Прикрепил файл, который нужно обработать (ImportANSYS.inp) и файл на Python (ANStoZEN_v0.py). Оба файла в находятся в ZIP архиве (anstozen.zip), который приложен к сообщению.
anstozen.zip
2) Результатом будет набор файлов (eli) в которых будет в зависимости от типа элемента (прописанного во второй строке файла) будут указаны в определенной последовательности узлы, входящие в каждый элемент.
Например для файла elout2.txt вторая строка содержит "et,2,185", следовательно данный набор нужно превратить в следующий
1 22 21 18 2 23 20 19 1 1 1 1 0 1 (первые 8 цифр номера узлов, постоянные 1 1 1 1 0 и номер элемента)
1 18 21 22 3 8 7 6 1 1 1 1 0 2
и еще 6 строчек. Эти 8 строк записать в файл с названием "Body 2". Слова Body 2 находятся в первой строчке файла elout2.txt.

3) Пока не понимаю как по первой строке определить название будущего файла и как по второй строке определить как обрабатывать следующие строки в файле.

Спасибо.
Также в сплойлере скрыт код на Python

Кликните здесь для просмотра всего текста
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
import re
import os
# для начального разделения файла на 2 - с узлами и элементами
nd_start = "/com,*********** Nodes for the whole assembly ***********"
nd_end = "/wb,elem,start            !  set before creation of elements"
el_start = "/wb,elem,start            !  set before creation of elements"
el_end = "/wb,elem,end               !  done creating elements"
 
with open("ImportANSYS.inp", "r") as fopen:
    for index, line in enumerate(fopen):
        if nd_start in line:
            num_nd_start = index
        if nd_end in line:
            num_nd_end = index
        if el_start in line:
            num_el_start = index
        if el_end in line:
            num_el_end = index
# создание промежуточного файла с узлами
with open("ImportANSYS.inp", "r") as fopen, open("nd.txt", "w") as fnd:  
    for index, line in enumerate(fopen):
        if num_nd_start+2 < index < num_nd_end-1:
            fnd.write(line)
# создание файла с узлами (удалил лишние пробелы в конце и в начале)
with open("nd.txt", "r") as fnd:
    with open("nd", "w") as fndw:
      lines = fnd.read().split('\n')
      out = [' '.join(line.split()) for line in lines]
      fndw.write('\n'.join(out))
# удаление промежуточного файла с узлами
os.remove("nd.txt")
 
#создание промежуточного файла с элементами
with open("ImportANSYS.inp", "r") as fopen, open("elinput.txt", "w") as fel:  
    for index, line in enumerate(fopen):
        if num_el_start < index < num_el_end+1:
            fel.write(line)
# здесь нужно добавить удаление имеющихся файлов, которые начинаются на elout
# вроде бы не требуется, тк эти файлы перезаписываются
 
 
# разделение промежуточного файла с элементами на несколько файлов
elinput = "elinput.txt"
elout = "elout" # префикс имен входных файлов
cnt, flg = 0, False
with open(elinput, "r") as fr:
    for line in fr:
         if re.match(r'/wb,elem', line):
            flg = False
         if re.match(r'/com,', line):
            cnt += 1
            felout = elout + str(cnt) + '.txt'
            flg = True
            with open(felout, "w") as fw:
                fw.write(line)
                fw.flush()
         elif flg:
            with open(felout, 'a') as fa:
                fa.write(line)
                fa.flush()
 
# просто проверка числа в переменной. Надо будет потом убрать.
print(cnt)
 
for filename in os.listdir():
    if filename.endswith(".txt") and filename.startswith("elout"):
 
        print(os.path.join(filename))
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
30.05.2023, 23:02
Цитата Сообщение от cosmosm Посмотреть сообщение
Да там действительно будет только 3 строки.
Нет, там можно, конечно и на 4 файла разделить... вопрос только в том, что требуется в итоге...

Цитата Сообщение от cosmosm Посмотреть сообщение
1 22 21 18 2 23 20 19 1 1 1 1 0 1 (первые 8 цифр номера узлов, постоянные 1 1 1 1 0 и номер элемента)
1 18 21 22 3 8 7 6 1 1 1 1 0 2
и еще 6 строчек. Эти 8 строк записать в файл с названием "Body 2". Слова Body 2 находятся в первой строчке файла elout2.txt.
В общем, теперь всё стало выглядеть ещё более запутано... вроде бы, сначала была озвучена задача разделить исходный файл на части... но теперь непонятно, для чего описание структуры строк? Или Вам требуется ещё и строки как-то разбивать?

Давайте так...
1. Приложите реальный исходный файл, предварительно разбейте его вручную на такие файлы, которые необходимо получить в итоге и их тоже приложите в архиве с исходным файлом.
2. Уточните: промежуточные файлы нужны только в целях дальнейшего разделения на другие файлы или для каких-то иных целей?
3. Если возможно, попытайтесь таки объяснить по каким критериям производилось разделение на файлы.
4. Уточните, возможны ли другие по внутренней структуре исходные файлы, предназначенные для разделения... если возможны, то их тоже желательно вложить в архив и разделить так, как требуется.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
31.05.2023, 09:39
YuS_2, похоже, это XY
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
31.05.2023, 14:54

Не по теме:

Цитата Сообщение от iSmokeJC Посмотреть сообщение
похоже, это XY
Э-м-м, в каком смысле? Что-то связанное с ДНК и хромосомами?

0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
31.05.2023, 15:33
YuS_2, XY Problem

Добавлено через 1 минуту
хабр
Пользователь хочет сделать X.
Пользователь не знает, как сделать X, но считает, что сможет нащупать путь к решению, если ему удастся сделать Y.
Пользователь не знает, как сделать и Y.
Пользователь начинает просить помощи с Y.
Люди пытаются помочь пользователю с Y, но Y кажется странной для решения проблемой.
Пользователю нужна помощь с X, а Y даже не является приемлемым решением X.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
31.05.2023, 17:08
iSmokeJC, а, ну да, очень похоже... потому и уточняю у ТС раз за разом, т.к. задачи в целом пока не видно...
0
0 / 0 / 0
Регистрация: 28.05.2023
Сообщений: 10
31.05.2023, 19:02  [ТС]
Преобразование геометрии (сетки элементов) из одной программы в другую.

Вроде как разобрался. Но все не успел написать.
Прикладываю исходный файл и конечные файлы, которые нужно получить (смотрите вложение).
Я допишу конца программу - выложу - посмотрите где косяки, где можно лучше сделать. Прошу не пинать, учусь на ходу...
Спасибо.
Вложения
Тип файла: 7z prims.7z (9.0 Кб, 4 просмотров)
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
01.06.2023, 11:51
Цитата Сообщение от cosmosm Посмотреть сообщение
Преобразование геометрии (сетки элементов) из одной программы в другую.
Принцип преобразования, всё ещё непонятен, но...

Цитата Сообщение от cosmosm Посмотреть сообщение
Прикладываю исходный файл и конечные файлы, которые нужно получить
Судя по результату конечных файлов:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os
import re
path = r'd:\TEST' # путь к каталогу, где расположен исходный файл
os.chdir(path)
fin = r'ImportANSYS.inp' # имя исходного файла
ext = r'.txt' # расширение имени целевых файлов
pat1 = r'/com,.+?(Nodes|Body) *(\b\d?\b)?[^"*]*"?([^"*]*)?"?'
pat2 = r'-1'
pat3 = r' +\d'
cnt, flg, out = 0, False, []
with open(fin, 'r') as fr:
    for line in fr:
        if re.match(pat2, line) and out:
            with open(fout, "w") as fw:
                fw.write(''.join(out))
                fw.flush()
            flg, out, fout = False, [], None
        if flg and re.match(pat3,line):
            out.append(line)
        if re.match(pat1, line):
            t = re.findall(pat1,line)[0]
            nout = 'nd' if re.match(r'Nodes',t[0]) else '_'.join(t)
            fout, flg = nout + ext, True
- этот код создаст из исходного файла, такие файлы, которые будут соответствовать Вашим итоговым файлам, но т.к. принцип перестановки столбцов не очень понятен и судя по всему, для разных файлов алгоритм разный, то строки в этих файлах останутся точно такими же, как и в исходном файле.
1
0 / 0 / 0
Регистрация: 28.05.2023
Сообщений: 10
01.06.2023, 20:47  [ТС]
Спасибо. Вы мне помогли с основой. Все получилось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.06.2023, 20:47
Помогаю со студенческими работами здесь

Сравнение строк по их начальным символам
У нас есть файл с содержанием: 123|456 456|789 qwe|rty. В программу поступают данные qwe она должна вывести rty. Сравнивать...

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

Разделение файла на части
Выбранный файл в ListBox1 нужно разделить на n-ное количество частей по нажатию кнопки Button4. Файл не должен создаваться с нуля, а уже...

Разделение файла через потоки на три равные части и создание нового файла .txt из значений исходного
Есть задача &quot;Создать новый файл из значений исходного, по правилу: третья часть содержимого исходного файла должна стать первой частью...

Разделение строки с именем на части
в общем нужно фио распарсить на ф и о тобиж из одной колонки в три 1,3 выходит без проблем , а вот как вторую замутить?) ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru