【问题标题】:Input a text file and write multiple output files in Python在 Python 中输入一个文本文件并写入多个输出文件
【发布时间】:2025-11-23 09:45:01
【问题描述】:

大家好,我正在输入一个 filename.txt 并生成多个输出文件 filename1.txt、filename2.txt 和 filename3.txt。这里更具体的是filename.txt中的输入数据:

Time(ms)  Channel 1  Channel 2  Channel 3
0.0       4.5        3.6        125
1.0       3.0        3.4        98
2.0       100        3.0        59
3.0       23         45.9       2.1
4.0       34         123        35
5.0       2.1        222        98

filename1.txt 应该只生成 Time 和 Channel 1 列的数据 filename2.txt 应该只生成 Time 和 Channel 2 列的数据 filename3.txt 应该只生成 Time 和 Channel 3 列的数据

源代码:

with open('filename.txt', 'r') as input:
    for i in range(1,4):
        with open('filename%i.txt' %i, 'w') as output:
            for line in input:
                columns = line.strip().split()
                for j in range(1,4):
                    output.write('{:10}{:10}\n'.format(columns[0], columns[j+1]))

编译后,我得到文本文件 filename1、filename2 和 filename3,但只有 filename1 中的数据。 filename2 和 filename3 数据发生了什么变化?

【问题讨论】:

标签: python


【解决方案1】:

for line in input 用尽input 文件中的所有行。如果您想再次浏览它们,则必须重新加载文件并从头开始......或者先将它们复制到另一个列表。

【讨论】:

  • 谢谢,刚开始使用 Python。比 C 更喜欢它。
【解决方案2】:

您只读取了一次输入,但尝试将其所有行迭代三次。您可以打开所有 3 个输出并同时写入所有输出,或者打开输入 3 次(每个输出文件一次)。最佳方法取决于您的具体要求(文件大小、输出文件的数量等)。

打开 3 次会产生更简洁的代码,但可能效率较低:

for i in range(1,4):
    with open('filename.txt', 'r') as input:
        with open('filename%i.txt' %i, 'w') as output:
            for line in input:
                columns = line.strip().split()
                output.write('{:10}{:10}\n'.format(columns[0], columns[i]))

如果没有with 子句,一次打开所有输出文件的通用解决方案会更好:

files = [open('filename%i.txt' %i, 'w') for i in range(1,4)]
with open('filename.txt', 'r') as input:
    for line in input:
        columns = line.strip().split()
        for j in range(1,4):
            files[j-1].write('{:10}{:10}\n'.format(columns[0], columns[j]))
for f in files:
    f.close()

(在这种情况下,您也必须手动处理异常)

【讨论】:

  • 感谢您的帮助。我才意识到我只读了一次,却写了三次。 “j”变量有什么意义吗?
  • 不。我的错误,在调整您的代码时,我将“j”留在那里。答案已更新
【解决方案3】:

只是一个提示。在第二个 with 语句之后,添加

input.seek(0)

也可以解决问题。

【讨论】:

    最近更新 更多