python文件读取 readlines

发布时间:2019-09-11 07:44:35编辑:auto阅读(1758)

    一、需求:

    有类似如下两个文件需要交差对比,进行处理。

         1.txt
    1
    2
    3
    1
         2.txt
    A
    B
    C
    D

    二、问题:

    首先想到的是打开之后,两次for循环就是了

    #错误写法
    f1=open(r"D:\pytest\1.txt",'r')
    f2=open(r"D:\pytest\2.txt",'r')
    
    for x in f1.readlines():
        for y in f2.readlines():
            print(x.strip()+y.strip())

    输出结果只有

    1A
    1B
    1C
    1D

    明显第一层未循环完成啊。

    于是测啊测,找啊找,终于明白了。readlines()是一次性工作,读入内存后迭代完成就没有了

    #输出测试
    f1=open(r"D:\pytest\1.txt",'r')
    f2=open(r"D:\pytest\2.txt",'r')
    
    x1=f1.readlines()
    for x in x1:
        x2=f2.readlines()
        print('x2 is : {}'.format(x2))
        for y in x2:
            print("X : {}".format(x.strip()))
            print("y:{}".format(y.strip()))
    

    输出

    x2 is : ['A\n', 'B\n', 'C\n', 'D']   #明显只请求一次
    X : 1
    y:A
    X : 1
    y:B
    X : 1
    y:C
    X : 1
    y:D
    x2 is : []   #之后不再重新请求,已成空值,外层停止循环
    x2 is : []
    x2 is : []

    三、解决

    可以给它在外层赋个变量存储一下。修改代码如下,终于2层循环正常输出了。

    #可用写法1
    f1=open(r"D:\pytest\1.txt",'r')
    f2=open(r"D:\pytest\2.txt",'r')
    
    X1=f1.readlines()
    X2=f2.readlines()
    for x in X1:
        for y in X2:
            print(x.strip()+y.strip())

    查找方法的过程中,发现with open 比直接用open更清晰,且不用显性的close(),于是修改代码

    #可用写法2
    with open(r"D:\pytest\1.txt",'r') as f1,open(r"D:\pytest\2.txt",'r') as f2:
        f11=f1.readlines()
        f22=f2.readlines()
        for x in f11:
            for y in f22:
                print(x.strip()+y.strip())

    测试环境为windows下python3.6

关键字