-1

这是我昨天的一个问题的延续。我正在尝试打开一个包含数字列表的文本文件。我想多次将这些数字写入一个新文件。循环的目的是能够多次写入源列表。在此示例中,我想打印 100 个数字的列表 10 次,因此我最终在输出文件中得到了 1000 个数字的列表。这是我正在使用的代码:

i = 10
while i > 0:
    with open ('C:/TestReq_100 Records.txt', 'r') as ipf:
       for line in ipf:
            num = line.strip()
            filename = 'processed.txt'
            with open('processed.txt', 'w') as opf:
                opf('%s' %num)


##           print num
    i = i - 1

如果我注释掉与写入文件相关的代码并在解释器中使用 print 命令,代码会执行我想要的操作。我似乎无法在文本文件中获得相同的输出。再说一次,我不是学生。只是尝试创建文件以在我公司的软件中使用以进行测试...谢谢!

4

4 回答 4

2

您没有确切说明输出中的问题是什么,但试试这个:

 opf.write('%s\n' %num)

代替

 opf('%s' %num)

备注

  1. 您正在write输出文件对象上调用该方法
  2. 您正在将换行符 ( \n) 添加到输出print中,默认情况下会这样做,这应该使您的 print 和 this 等效。

您一遍又一遍地打开同一个文件并写入它,这是您的意图吗?您只会保留您最后写入该文件的任何内容。在您的帖子中提供更多详细信息(关于输出的具体问题,以及您给定的输入和所需的输出将更容易帮助您实现目标)

更新基于下面评论中的更多信息。

按照这些思路构建您的程序(尽管由于缺乏明确的规范,确切的顺序有点不确定,但您可以将其用作指南):

with open ('C:/TestReq_100 Records.txt') as ipf:
    with open('processed.txt', 'w') as opf:
        i = 10
        while i > 0:
            for line in ipf:
                num = line.strip()
                filename = 'processed.txt'
                write.opf('%s\n' %num)
##           print num
            i = i - 1

输出文件在循环之前打开一次。

顺便说一句,如果您使用的是相当新的 Python 版本,您可以将两个with语句合并为一个:

with open('C:/TestReq_100 Records.txt') as ipf,open('processed.txt','w') as opf:

请注意,您可以使用两个 for 循环,即用 for 循环替换当前的 while 循环,但这更多的是样式和语义问题,它不会影响代码的功能。

于 2012-07-28T21:02:32.883 回答
2

除了 Levon 的回答之外,您当前的程序还有一些问题。

  • 与其手动初始化和递减索引,不如尝试使用xrange更简洁的方式完成相同的任务。

  • 您正在为每个数字覆盖 processes.txt ;您应该与输入文件同时打开它。

  • 目的是i什么?就目前而言,您的程序将执行完全相同的操作 10 次,因为i从未在循环内使用过。

  • '%s' % numnum当已经是一个字符串时没有什么特别的。

也就是说,这是您的程序的一个更简洁的版本,尽管i仍然没有特别做任何事情:

for i in xrange(10, 0, -1):
    with open('C:/TestReq_100 Records.txt', 'r') as ipf:
        with open('processed.txt', 'w') as opf:
            for line in ipf:
                num = line.strip()
                opf.write(num)

您可能想澄清该程序的预期输出以获得更好的答案。

编辑:这是将文件多次复制到新文件中的更有效解决方案:

# Read the input data once.
with open('C:/TestReq_100 Records.txt', 'r') as ipf:
    ipdata = ipf.read()
# Add a newline to the end of the file if there isn't already one present.
# Without this, the last and first lines of the input might become single lines.
if ipdata[-1] != '\n':
    ipdata += '\n'
# Write to the output file multiple times.
with open('processed.txt', 'w') as opf:
    for i in xrange(10):
        opf.write(ipdata)
于 2012-07-28T21:10:42.803 回答
0

你没有具体说明你的问题是什么,但看起来你至少有两个问题。

首先,您在'w'模式下多次打开同一个文件。 'w'mode 不会附加到现有文件,它会覆盖现有文件。所以你只会得到循环的最后一次迭代。您可以通过在循环开始之前打开文件并在结束后关闭它来解决此问题。如果需要,您仍然可以使用with语法来执行此操作。

其次,我认为你需要使用opf.write()而不是只是opf(),除非这是我不知道的语法。

试试这个:

with open ('C:/TestReq_100 Records.txt', 'r') as ipf:
    with open('processed.txt', 'w') as opf:
        i = 10
        while i > 0:
            for line in ipf:
                num = line.strip()
                filename = 'processed.txt'
                opf.write('%s' %num)
            i = i - 1
于 2012-07-28T21:09:00.620 回答
0

如果我理解正确,应该这样做......(在 2.7.x 中)

from itertools import islice

MAX = 10

with open('infile') as fin, open('outfile', 'w') as fout:
    for line in islice(fin, MAX):
        print >> fout, line.strip()
于 2012-07-28T21:16:18.763 回答