【问题标题】:How to write each part of a file in a seperate directory?如何将文件的每个部分写入单独的目录中?
【发布时间】:2020-08-26 17:12:10
【问题描述】:

我有一个文件(名称: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

【问题讨论】:

  • 每个时间步的行数是否相同?
  • 是的,每个时间步都有相同的行数
  • 仔细检查您的代码。当你每次循环 for i in range(0, len(all_lines) 时会发生什么?无论如何,Pranav 的答案是正确的。
  • @Sophi,我认为原始输入文件的格式有些混乱。您能否确认您的state2 文件看起来像我编辑的那样?即两行数字之间没有空行?
  • @PranavHosangadi,是的,您的修改是正确的。没有空行

标签: python file-io


【解决方案1】:

您不需要嵌套的 forifbreak 恶作剧。您需要做的就是:

  • 遍历原始文件中的行。
    1. 当您看到“timestep”时,打开一个要写入的新文件并移至下一行。
    2. 如果您没有看到“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)

【讨论】:

  • 请回滚您对 OP 问题的编辑。您已删除 state2 文件中的行之间的换行符...那些可能是故意的和文件的一部分...(或至少添加换行符)
  • @Yatin,由于 OP 在其原始代码中写入all_lines[i+1], all_lines[i+2],因此两行数据之间没有空行是理所当然的。当 OP 没有格式化问题的那部分并且需要添加两个换行符以获取 SO 的降价以显示换行符时,换行符就在那里。
  • @PranavHosangadi,我试过你的代码,得到:elif fout is not None: ^ SyntaxError: invalid syntax
  • @PranavHosangadi 这本身可能是 OP 的代码无法正常工作的原因... Sophi,您的文件是否在每个值行之后都有换行符...?
  • @PranavHosangadi,不,它没有空行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2021-06-26
  • 1970-01-01
  • 2012-06-19
  • 2014-09-26
  • 2019-10-08
  • 1970-01-01
相关资源
最近更新 更多