-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。これはデフォルトで実行されます。これにより、印刷とこれが同等になります。

同じファイルを何度も開いて書き込んでいますが、それはあなたの意図ですか?そのファイルに最後に書き込んだものだけを保持します。あなたの投稿のもう少し詳細(出力に関する特定の問題について、そしてあなたの与えられた入力と望ましい出力はあなたがあなたの目標を達成するのを助けるのをより簡単にするでしょう)

以下のコメントの詳細に基づいて更新してください。

これらの線に沿ってプログラムを構成します(明確な仕様がないため、正確な順序は少しわかりにくいですが、これをガイドとして使用できます)。

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

出力ファイルは、ループの前に1回開かれます。

ちなみに、かなり新しいバージョンのPythonを使用している場合は、両方のwithステートメントを1つにまとめることができます。

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

2つのforループを使用することもできます。つまり、現在のwhileループをforループに置き換えることもできますが、それはスタイルとセマンティクスの問題であり、コードの機能には影響しません。

于 2012-07-28T21:02:32.883 に答える
2

Levon の回答に加えて、現在のプログラムにはいくつかの問題があります。

  • インデックスを手動で初期化およびデクリメントするのではなく、 を使用xrangeして同じタスクをより簡潔な方法で実行してみてください。

  • 各番号のprocessed.txtを上書きしています。入力ファイルと同時に開く必要があります。

  • の目的はi何ですか? i現状では、はループ内で使用されないため、プログラムはまったく同じことを 10 回実行します。

  • '%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

問題の内容は特定されていませんが、少なくとも 2 つの問題があるようです。

まず、'w'モードで同じファイルを複数回開いています。 'w'モードは既存のファイルに追加せず、既存のファイルを上書きします。したがって、ループの最後の反復のみを取得します。これを解決するには、ループが開始する前にファイルを開き、終了後に閉じます。with必要に応じて、構文を使用してこれを行うこともできます。

第二に、私が認識していない構文でない限りopf.write()、 just の代わりに使用する必要があると思います。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 に答える