我有两个文件,比如source和target。我比较源中的每个元素以检查它是否也存在于目标中。如果目标中不存在,我打印它(最终目标是0差异)。这是我写的代码。
def finddefaulters(source,target): f = open(source,'r') g = open(target,'r') reference = f.readlines() done = g.readlines() for i in reference: if i not in done: print i,
我需要帮助
另一个问题 - 当我将所有行都读为列表元素时,它们被解释为'element \ n' - 因此,为了正确比较,我必须在每个文件的末尾添加换行符。有没有办法去除换行符,所以我不必在文件末尾添加换行符。我试过rstrip。但它没有用。 提前谢谢。
答案 0 :(得分:2)
一些想法:
1)使用[with]
安全地打开文件:
with open(source) as f:
.............
with语句用于包装 用方法执行块 由上下文管理器定义。这个 允许共同尝试......除了......最后 要封装的使用模式 方便重用。
2)你可以迭代文件的行而不是使用readlines:
for line in f:
..........
3)虽然对于这个简短的片段就足够了,但尝试为变量使用更多信息性的名称。不建议使用单字母名称。
4)如果你想获得python lib的利润,可以试试difflib
模块中的函数。例如:
make_file(fromlines, tolines[, fromdesc][, todesc][, context][, numlines])
比较fromlines和tolines(列表 字符串)并返回一个字符串 是一个完整的HTML文件,包含一个 表格逐行显示差异 具有行间和行内更改 突出显示。
答案 1 :(得分:2)
关于效率:您展示的方法有asymptotic runtime complexity O(m*n)
,m
和n
是{reference
中的元素数量1}}和done
,即如果你将两个列表的大小加倍,算法将运行4倍(对于理论计算机科学家来说,固定常数的一倍)。如果m
和n
非常大,您可能希望选择更快的算法,例如,首先使用.sort()
(运行时复杂度:O(n * log(n))
)对两个列表进行排序,并且然后只浏览一次列表(运行时复杂度:O(n)
)。该算法的运行时复杂度最差为O(n * log(n))
,这已经是一个很大的改进。但是,为了提高效率,您需要交换代码的可读性和简单性,因此我建议您在绝对必要的情况下执行此操作。
关于编码样式:您没有.close()
您应该使用的文件句柄。您可以使用python的with
language construct,而不是打开和关闭文件句柄。此外,如果您喜欢功能样式,可以使用列表表达式替换for循环:
for i in reference:
if i not in done:
print i,
然后变成:
items = [i.strip() for i in reference if i not in done]
print ' '.join(items)
但是,通过这种方式,您在撰写列表时不会看到任何进展。
正如joaquin已经提到的那样,您可以直接循环f
而不是f.readlines()
,因为文件句柄支持iterator protocol。