Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Python中的两个文件_Python - Fatal编程技术网

比较Python中的两个文件

比较Python中的两个文件,python,Python,我试图比较Python中的两个文件A和C,由于某种原因,double for循环似乎无法正常工作: with open(locationA + filenameC,'r') as fileC, open(locationA + filenameA,'r') as fileA: for lineC in fileC: fieldC = lineC.split('#') for lineA in fileA: fieldA =

我试图比较Python中的两个文件A和C,由于某种原因,double for循环似乎无法正常工作:

with open(locationA + filenameC,'r') as fileC, open(locationA + filenameA,'r') as fileA:
     for lineC in fileC:
         fieldC = lineC.split('#')
         for lineA in fileA:
             fieldA = lineA.split('#')
             print 'UserID Clicks' + fieldC[0]
             print 'UserID Activities' + fieldA[0]
             if (fieldC[0] == fieldA[0]) and (fieldC[2] == fieldA[2]):
                 print 'OK'
这里,似乎只比较C的行,但对于其他行,“A循环”似乎被忽略


有人能帮我吗

您的问题是,一旦迭代了
fileA
,就需要再次更改指向文件开头的指针。 因此,您可以从这两个文件中创建两个列表,并根据需要对它们进行多次迭代。例如:

fileC_list = fileC.readlines()
fileA_list = fileA.readlines()
for lineC in fileC_list:
  # do something
  for lineA in fileA_list:
    # do somethins

嵌套循环的问题(从您当前问题的角度来看)恰恰是内部循环在外部循环的每次迭代中运行到完成。因此,通过从
fileA
迭代器显式调用下一项来设置
lineA

with open(locationA + filenameC,'r') as fileC, open(locationA + filenameA,'r') as fileA:
     for lineC in fileC:
         fieldC = lineC.split('#')
         lineA = next(fileA)
         fieldA = lineA.split('#')
         print 'UserID Clicks' + fieldC[0]
         print 'UserID Activities' + fieldA[0]
         if (fieldC[0] == fieldA[0]) and (fieldC[2] == fieldA[2]):
             print 'OK'
一旦
fileC
用完,此逻辑将忽略
fileA
中的任何额外行,如果
fileC
包含的行数超过
fileA
的行数,如果不进行特殊检查,情况也可能会变得不好

另一种方法可以使用
itertools.izip()
成对地从每个文件收集行:

import itertools
with open(locationA + filenameC,'r') as fileC, open(locationA + filenameA,'r') as fileA:
for lineC, lineA in itertools.izip(fileC, fileA):
         fieldC = lineC.split('#')
         fieldA = lineA.split('#')
         print 'UserID Clicks' + fieldC[0]
         print 'UserID Activities' + fieldA[0]
         if (fieldC[0] == fieldA[0]) and (fieldC[2] == fieldA[2]):
             print 'OK'

我想不出使用其中一个而不是另一个的具体原因,但是如果文件大小不一样,请拒绝使用内置的
zip()
函数而不是
itertools.izip()
——前者返回一个列表,因此内存使用情况取决于文件大小,而后者是一个生成器,然后根据需要创建值。

您正在比较FileA中的所有行和FileC中的每一行。这意味着,对于文件C的每一行,您将读取整个文件A,并且(如果您将指针移动到文件A的开头),您将一次又一次地读取它

当它们都有行时,同时阅读它们更容易 如果它们是相同的,那么做一些事情,从两者中阅读

如果它们不同,则从最小值读取(A行
在剩下的行中做最后两个循环(两个循环,每个文件一个循环,因为你不知道哪一个循环的行数用完了)

我知道这是一个旧线程,但当有人在google上寻找一个解决方案来比较python中的两个文本文件时,它出现了

这个代码对我有用

您可以更新代码并使用“with open”代替,并根据需要进行微调,但它可以完成这项工作

# Ask the user to enter the names of files to compare
fname1 = input("Enter the first filename (text1.txt): ")
fname2 = input("Enter the second filename (text1.txt): ")

# Open file for reading in text mode (default mode)
f1 = open(fname1)
f2 = open(fname2)

# Print confirmation
print("-----------------------------------")
print("Comparing files ", " > " + fname1, " < " +fname2, sep='\n')
print("-----------------------------------")

# Read the first line from the files
f1_line = f1.readline()
f2_line = f2.readline()

# Initialize counter for line number
line_no = 1

# Loop if either file1 or file2 has not reached EOF
while f1_line != '' or f2_line != '':

    # Strip the leading whitespaces
    f1_line = f1_line.rstrip()
    f2_line = f2_line.rstrip()

    # Compare the lines from both file
    if f1_line != f2_line:

        # If a line does not exist on file2 then mark the output with + sign
        if f2_line == '' and f1_line != '':
            print(">+", "Line-%d" % line_no, f1_line)
        # otherwise output the line on file1 and mark it with > sign
        elif f1_line != '':
            print(">", "Line-%d" % line_no, f1_line)

        # If a line does not exist on file1 then mark the output with + sign
        if f1_line == '' and f2_line != '':
            print("<+", "Line-%d" % line_no, f2_line)
        # otherwise output the line on file2 and mark it with < sign
        elif f2_line != '':
            print("<", "Line-%d" %  line_no, f2_line)

        # Print a blank line
        print()

    #Read the next line from the file
    f1_line = f1.readline()
    f2_line = f2.readline()


    #Increment line counter
    line_no += 1

# Close the files
f1.close()
f2.close()
#要求用户输入要比较的文件名
fname1=input(“输入第一个文件名(text1.txt):”)
fname2=输入(“输入第二个文件名(text1.txt):”)
#以文本模式(默认模式)打开文件进行读取
f1=打开(fname1)
f2=开路(fname2)
#打印确认
打印(“---------------------------------------”)
打印(“比较文件”、“>”+fname1、<“+fname2,sep=”\n')
打印(“---------------------------------------”)
#从文件中读取第一行
f1_line=f1.readline()
f2_line=f2.readline()
#初始化行号的计数器
第1行
#如果文件1或文件2未达到EOF,则循环
而f1_行!=''或f2_线!='':
#去掉前面的空白
f1_line=f1_line.rstrip()
f2_line=f2_line.rstrip()
#比较两个文件中的行
如果f1_线!=f2_线:
#如果文件2上不存在行,则用+号标记输出
如果f2_线==''和f1_线!='':
打印(“>+”,“行-%d”%行号,f1行)
#否则,输出file1上的行并用>符号标记它
elif f1_行!='':
打印(“>”,“行-%d”%行号,f1行)
#如果文件1上不存在行,则用+号标记输出
如果f1_线==''和f2_线!='':

print(“The
difflib
模块?在外循环的第一次迭代中,当您到达内循环中
fileA
的末尾时,指针位于文件的末尾。随后尝试迭代该文件将不会有任何作用。@jornsharpe关于问题的原因是正确的。您需要
fileA.seek(0)
重置句柄.os.system('diff'+filenameA+''+filenameB)…好的,好的,只是开玩笑你真的想比较A中的每一行和C中的每一行吗?并进行两次比较?最好在第一个for块的开头执行fileA.seek(0)。