0

勤務先の会社に属する特定の外部アプリケーションを使用するPythonスクリプトを作成しようとしています。プログラミングとスクリプティングに関しては、一般的に自分で理解することができますが、今回は本当に迷っています。

whileループが意図したとおりに機能しない理由がわからないようです。それは私を助けないエラーを与えません。ループの中央にあるコードの重要な部分をスキップして、その後のように「カウント」をインクリメントしているように見えます。

f = open('C:/tmp/tmp1.txt', 'w')    #Create a tempory textfile
f.write("TEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\n") #Put some simple text in there
f.close()   #Close the file

count = 0   #Insert the line number from the text file you want to begin with (first line starts with 0)
num_lines = sum(1 for line1 in open('C:/tmp/tmp1.txt')) #Get the number of lines from the textfile

f = open('C:/tmp/tmp2.txt', 'w')    #Create a new textfile
f.close()   #Close it

while (count < num_lines):  #Keep the loop within the starting line and total number of lines from the first text file
    with open('C:/tmp/tmp1.txt', 'r') as f: #Open the first textfile
        line2 = f.readlines()   #Read these lines for later input
        for line2[count] in f:  #For each line from chosen starting line until last line from first text file,...
            with open('C:/tmp/tmp2.txt', 'a') as g: #...with the second textfile open for appending strings,...
                g.write("hello\n")  #...write 'hello\n' each time while "count" < "num_lines"
    count = count + 1   #Increment the "count"

「f:のline2 [count]の場合」まで、すべてがうまくいくと思います。

私が取り組んでいる実際のコードはやや複雑で、使用しているアプリケーションは正確に共有するためのものではないため、問題を修正するためだけに、コードを単純化してばかげた出力を提供します。

私は代替コードを探していません。ループが機能しない理由を探しているだけなので、自分で修正することができます。

すべての回答に感謝し、事前に皆さんに感謝します!

コーマック

4

3 に答える 3

2

いくつかのコメント:

num_lines = sum(1 for line1 in open('C:/tmp/tmp1.txt'))

なんで?何が問題なのlen(open(filename, 'rb').readlines())ですか?

while (count < num_lines):
    ...
    count = count + 1

これは悪いスタイルです、あなたは使うことができます:

for i in range(num_lines):
    ...

i普遍的に認識されているインデックスに名前を付け、ループを使用rangeしたことに注意してください。for

さて、コメントで言ったように、あなたの問題はそれfがファイル(つまり、ロケーションポインタを持つバイトのストリーム)であり、そこからすべての行を読み取ったことです。したがって、そうすると、行を読み込もfor line2[count] in f:うとしますline2[count](これは少し奇妙ですが、実際には、リストメンバーをインデックスとして使用するループはほとんどありませんが、forそれは可能です)、読み取る行がないことを確認してください。ループ内にあるものを実行することはありません。

とにかく、指定された行番号から始めて、ファイルを1行ずつ読み取りたいですか?これを行うためのより良い方法は次のとおりです。

from itertools import islice

start_line = 0 # change this
filename = "foobar" # also this

with open(filename, 'rb') as f:
    for line in islice(f, start_line, None):
        print(line)

代替コードは必要ないことは承知していますが、コードは本当に不必要に複雑です。

于 2012-07-06T14:49:38.110 に答える
0

ファイルfの行を繰り返し処理する場合は、「for」行を次のように置き換えることをお勧めします。

for line in line2:
    # do something with "line"...

line2という配列に行を配置するので、その配列を使用してください。line2[count]をループ変数として使用することは私には意味がありません。

于 2012-07-06T14:41:59.027 に答える
0

'for行のf'ループがどのように機能するかを間違えているようです。読み取る行がなくなるまで、ファイルを繰り返し処理してreadlineを呼び出します。ただし、ループを開始した時点では、すべての行がすでに読み取られており(f.readlines()を介して)、ファイルの現在の位置は終了しています。f.seek(0)を呼び出すことで目的を達成できますが、ファイルを再度読み取ることになり、IOが遅くなるため、とにかくそれは適切な決定ではないようです。代わりに、次のようなsmthを実行します。

for line in line2[count:]: # iterate over lines read, starting with `count` line
    do_smth_with(line)
于 2012-07-06T14:48:16.613 に答える