我有两个长度相同的字符串列表但是当我将它们写入文件时,每个项目出现在文件的不同行中,它们的列表和文件长度不匹配:
print len(x)
print len(y)
317858
317858
但是,当我将列表中的每个项目写入文本文件时: 文本文件中的行数与列表的长度不匹配。
with open('a.txt', 'wb') as f:
for i in x[:222500]:
print >> f, i
在linux中,wc -l a.txt
给出了222499,这是正确的。
with open('b.txt', 'wb') as f:
for i in y[:222500]:
print >> f, i
在linux中,wc -l b.txt
给出239610这是错误的。
当我在终端中vi b.txt
时,确实有239610行,所以我很困惑为什么会发生这种情况。
我该怎么调试呢?
答案 0 :(得分:0)
在b.txt中找到比写入的字符串数更多的行的唯一可能方法是Scanner
中的某些字符串实际上包含新行。
这是一个小例子
y
这个小代码将打印2,因为列表l包含2个元素,但生成的文件将包含3行:
l = [ 'a', 'b\nc']
print len(l)
with open('tst.txt', 'wb') as fd:
for i in l:
print >> fd, i
答案 1 :(得分:0)
我相信其他人会很快指出这种差异的原因(它与换行符相关),但是因为你问'我怎么调试这个?'我想解决这个问题:
由于通过和失败的运行之间的唯一区别是列表本身,我会专注于那些。列表(即,至少一个不同的列表元素)之间存在一些差异,这触发了这一点。因此,您可以执行二进制搜索以找到触发此操作的第一个不同的列表元素。
为此,只需将列表分成两半,例如取每个列表的前317858/2行。你还观察到同样的症状吗?如果是这样,请在上半场重复练习。否则,在下半场重复练习。这样,您最多需要19次尝试来识别触发此行的行。此时,问题被简化为单个字符串。
您可以通过查看字符串来发现问题,但原则上(例如,如果字符串很长),您可以继续对这些字符串进行二进制搜索以识别触发此字符串的第一个字符问题。