【问题标题】:Finding missing lines in file查找文件中缺少的行
【发布时间】:2018-06-29 15:09:30
【问题描述】:

我有一个 7000 多行的 .txt 文件,其中包含描述和图像的有序路径。示例:

abnormal /Users/alex/Documents/X-ray-classification/data/images/1.png
abnormal /Users/alex/Documents/X-ray-classification/data/images/2.png
normal /Users/alex/Documents/X-ray-classification/data/images/3.png
normal /Users/alex/Documents/X-ray-classification/data/images/4.png

缺少某些行。我想以某种方式自动搜索缺失的行。我直觉地写道:

f = open("data.txt", 'r')
lines = f.readlines()
num = 1
for line in lines:
    if num in line:
        continue
    else:
        print (line)
    num+=1

但它当然没有用,因为行是字符串。 有什么优雅的方法可以解决这个问题吗?也许使用正则表达式? 提前致谢!

【问题讨论】:

  • 使用str(num)进行字符串比较?

标签: python string list file search


【解决方案1】:

以下应该可以工作 - 它从文件名中获取数字,查看它是否比前一个数字高 1 以上,如果是,则计算出所有“中间”数字并打印它们。需要打印数字(然后稍后重建文件名),因为line 在迭代期间永远不会包含丢失文件的名称。

# Set this to the first number in the series -1
num = lastnum = 0

with open("data.txt", 'r') as f:
    for line in f:
        # Pick the digit out of the filename
        num = int(''.join(x for x in line if x.isdigit()))
        if num - lastnum > 1:
          for i in range(lastnum+1, num):
            print("Missing: {}.png".format(str(i)))
        lastnum = num

这种工作方式的主要优点是,只要您的文件在列表中排序,它就可以处理从1以外的数字开始,并且还报告序列中多个缺失的数字。

【讨论】:

    【解决方案2】:

    你可以试试这个:

    lines = ["abnormal /Users/alex/Documents/X-ray-classification/data/images/1.png","normal /Users/alex/Documents/X-ray-classification/data/images/3.png","normal /Users/alex/Documents/X-ray-classification/data/images/4.png"]
    maxvalue = 4 # or any other maximum value
    missing = []
    i = 0
    for num in range(1, maxvalue+1):
        if str(num) not in lines[i]:
            missing.append(num)
        else:
          i += 1
    
    print(missing)
    

    或者如果你想检查以XXX.png结尾的行:

    lines = ["abnormal /Users/alex/Documents/X-ray-classification/data/images/1.png","normal /Users/alex/Documents/X-ray-classification/data/images/3.png","normal /Users/alex/Documents/X-ray-classification/data/images/4.png"]
    maxvalue = 4 # or any other maximum value
    missing = []
    i = 0
    for num in range(1, maxvalue+1):
        if not lines[i].endswith(str(num) + ".png"):
            missing.append(num)
        else:
          i += 1
    
    print(missing)
    

    示例:here

    【讨论】:

    • 谢谢,但两个版本都有错误:TypeError: 'bool' object is not iterable in line 5
    • @AlexNikitin 感谢您的报告,已修复,现在应该可以使用了
    猜你喜欢
    • 2017-08-02
    • 2014-02-06
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多