#python #file-io
#python #file-io
Вопрос:
У меня есть файл (имя: state2
) со следующей структурой:
timestep
0.0000000 0.0000000 0.0000000
0.0000000 0.0000000 1.2176673
timestep
-0.0151405 -0.0000000 -0.0874954
-0.0347223 0.0000001 1.2559323
timestep
-0.0492274 0.0000001 -0.1238961
-0.0976473 -0.0000002 1.2335932
.... (24 timesteps)
Я пытаюсь поместить каждую timestep
(только числа) в отдельный файл в каталоге. Я написал следующий код, но он записывает в файл только данные первого временного шага. Если я удалю break
, то он снова запишет весь исходный файл в отдельные файлы.
import os
steps = []
BaseDir=os.getcwd()
data=os.path.join(BaseDir, 'state2')
f= open(data, 'r')
all_lines = f.readlines()
for k in range(24):
path = os.path.join(BaseDir, 'steps_{0:01d}'.format(k))
os.mkdir(path)
dest = os.path.join(BaseDir,'steps_{0:01d}'.format(k), 'step{0:01d}'.format(k))
fout = open(dest, 'w')
for i in range(0, len(all_lines)):
if 'timestep' in all_lines[i]:
fout.write('{0}{1}}'.format(all_lines[i 1], all_lines[i 2]))
break
Комментарии:
1. Имеет ли каждый временной шаг одинаковое количество строк?
2. да, каждый временной шаг имеет одинаковое количество строк
3. Внимательно изучите свой код. Что происходит, когда вы повторяете цикл
for i in range(0, len(all_lines)
каждый раз? В любом случае ответ Пранава имеет правильную идею.4. @Sophi, я думаю, что есть некоторая путаница в формате исходного входного файла. Можете ли вы, пожалуйста, подтвердить, что ваш
state2
файл выглядит так, как я его отредактировал? т. Е. в нем нет пустых строк между двумя строками чисел?5. @PranavHosangadi, да, ваша модификация верна. пустой строки нет
Ответ №1:
Вам не нужны вложенные for
схемы с if
и break
. Все, что вам нужно сделать, это:
- Выполните итерацию по строкам в исходном файле.
- Когда вы увидите «timestep», откройте новый файл для записи и перейдите к следующей строке.
- Если вы не видите «timestep», запишите строку в текущий файл и перейдите к следующей строке.
fout = None
timestepnum = 0
for line in all_lines:
if line == "timestep": # Or whatever condition you identify
# this line says timestep, so we have now started looking at a new timestep (condition 1)
if fout is not None:
fout.close() # close the old timestep's file if it is already open
timestepnum = 1
# make the directory
path = os.path.join(BaseDir, 'steps_{0:01d}'.format(timestepnum))
os.mkdir(path)
# open the file
filename = os.path.join(BaseDir, f"steps_{timestepnum:01d}", f"step{timestepnum:01d}") # Code to specify file name
fout = open(filename, 'w')
elif fout is not None:
# Condition 2 -- write this line as-is to the file.
fout.write(line)
Комментарии:
1. пожалуйста, откатите свою правку по вопросу OP. Вы удалили разрывы строк между строками в
state2
файле… Те, где, вероятно, намеренно и часть файла… (или, по крайней мере, добавить разрывы строк обратно)2. @Yatin, поскольку OP пишет
all_lines[i 1], all_lines[i 2]
в своем исходном коде, само собой разумеется, что между двумя строками данных нет пустой строки. Разрывы строк были там с того момента, когда OP не отформатировал эту часть вопроса, и ему нужно было добавить две новые строки, чтобы получить SO markdown для отображения разрывов строк.3. @PranavHosangadi, я попробовал ваш код и получил: если значение fout не равно None: ^ Ошибка синтаксиса: недопустимый синтаксис
4. @PranavHosangadi это само по себе может быть причиной того, что код OP не работает… Софи, в вашем файле есть разрывы строк после каждой строки значений …?
5. @PranavHosangadi, нет, в нем нет пустых строк