2012-03-09 9 views
-1

私は2つの行が一緒に比較されるパーサを記述しています(話すために 'mainline'その前に来た)。両方の行が一致すると、メインラインは破棄されます。改行やキャリッジリターンの改行のみで構成されている行でのみこれを実行したいだけです。だから私はこのコードPython:if文で 'または'を使用すると、条件が満たされなくてもコードが実行されます

lastline = 0 
pointer = 0 
for lines in fileLines: 
    mainline = fileLines[pointer] 
    if lastline != 0: 
     print "Last Line: ",lastline 
     print "This Line: ",mainline 
     if lastline == '\n' or '\r\n': 
      if mainline == '\n' or '\r\n': 
       print "Would drop" 
    lastline = mainline 
    pointer = pointer + 1 

それは、文字列は確かにこれら4つのオプションのいずれかでない場合には、「ドロップだろう」印刷しますループのためにそれを通過するごとに、単一の時間を持っています。私は何かを完全に後ろ向きにしていると思っていますが、私は自分自身にPythonを教えているので、何か間違っていると話す人はいません。皆さん、ありがとうございます。これがなぜ起こっているのか?

すべてのおかげで、それは完璧に働いています。ありがとう!!!

+0

以下の回答は、コードのエラーを解決しました。しかし、異なる行末に明示的にコーディングする必要はないことに注意することが重要です。 http://www.python.org/dev/peps/pep-0278/を参照してください。 –

答えて

6
lastline == '\n' or '\r\n' 

はあなたがor間違っを使用している

if lastline in ('\n', '\r\n'): 

または

if lastline == '\n' or lastline == '\r\n': 
+2

編集できませんが、最後の例では 'lastline == '\ n'または...'の代わりに 'if lastline == '\ n''を意味しませんか? –

3

lastline == '\n' or '\r\n'は、(常に真である)ないlastline == '\n' or lastline == '\r\n'(lastline == '\n') or '\r\n'と同じです。

代わりにlastline in ('\n', '\r\n')が必要です(2番目の場合と同様)。

4

あなたが実際に必要とする:

if mainline == '\n' or mainline == '\r\n' 

その変更がなければ、あなたのコードは、現在の提示を求めている:

is mainline == '\n' True? 
or 
is '\r\n' True? 

を非空白文字列がTrueに評価されているので、2番目の質問への答えは常にはい。

1

のいずれかをしたい

(lastline == '\n') or ('\r\n') 
(lastline == '\n') or bool('\r\n') 
(lastline == '\n') or True 
True 

と同じです。 書く必要があります。

if lastline == '\n' or lastline == 'r\n': 
.... 

そうでない場合は、常にtrueです。

1

注:コード内のエラーを解決するその他の回答を参照してください。この答えは改行についてです。

あなたは行末を心配する必要はありませんように、Pythonはuniversal newline supportがあります

fnames = ['a.txt','b.txt'] 
endings = ['\n', '\r\n'] 
for fname, ending in zip(fnames, endings): 
    with open(fname, 'wb') as f_out: # explicitly 'wb' for binary 
     f_out.write('a%sb%s' % (ending, ending)) 


for mode in ('rb', 'r'): 
    print 'mode:', mode 
    for fname in fnames: 
     with open(fname, mode) as f_in: 
      print "%s contains : %s" % (fname, repr(f_in.read())) 
    print 

は、ここでの教訓は、あなたがバイナリでファイルを開けない場合は、ということです

mode: rb 
a.txt contains : 'a\nb\n' 
b.txt contains : 'a\r\nb\r\n' 

mode: r 
a.txt contains : 'a\nb\n' 
b.txt contains : 'a\nb\n' 

を与えますモードでは、行末を心配する必要はありません。

関連する問題