我正在编写一个解析器,其中两条线被比较在一起(可以说是'mainline'和它之前的线)。如果这两条线都匹配,则主线被丢弃。我只希望这发生在仅包含换行符或回车换行符的行上。所以我有这个代码
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
每次通过for循环时,它会打印“会掉线”,当字符串肯定不是这四个选项中的任何一个时。我想我正在做一些完全倒退的事情,但是我正在给自己教python,所以当我出错时,我真的没有人告诉我。感谢上帝,你们都在这里。任何想法为什么会发生这种情况?
感谢您的所有帮助,这是完美的。感谢!!!
答案 0 :(得分:6)
lastline == '\n' or '\r\n'
与
相同(lastline == '\n') or ('\r\n')
(lastline == '\n') or bool('\r\n')
(lastline == '\n') or True
True
你想要
if lastline in ('\n', '\r\n'):
或
if lastline == '\n' or lastline == '\r\n':
答案 1 :(得分:4)
你真的需要:
if mainline == '\n' or mainline == '\r\n'
如果没有这种更改,您的代码目前正在询问:
is mainline == '\n' True?
or
is '\r\n' True?
由于非空白字符串的评估结果为True
,因此第二个问题的答案始终为是。
答案 2 :(得分:3)
lastline == '\n' or '\r\n'
与(lastline == '\n') or '\r\n'
相同(始终为真),不 lastline == '\n' or lastline == '\r\n'
。
您需要lastline in ('\n', '\r\n')
(类似于第二个)。
答案 3 :(得分:1)
您正在使用or
错误。
你应该写
if lastline == '\n' or lastline == 'r\n':
....
否则if总是如此。
答案 4 :(得分: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'
这里的教训是,如果您不以二进制模式打开文件,则无需担心行结尾。