0

可能重复:
逐行比较两个不同的文件并将差异写入第三个文件 - Python

我脑海中的逻辑是这样的......对于import_file中的行检查它是否包含Existing-user-string-list中的任何项目如果它包含该列表中的任何项目然后删除该行文件。

filenew = open('new-user', 'r')
filexist = open('existing-user', 'r')
fileresult = open('result-file', 'r+')
xlines = filexist.readlines()
newlines = filenew.readlines()
for item in newlines:
    if item contains an item from xlines
        break
    else fileresult.write(item)
filenew.close()
filexist.close()
fileresult.close()

我知道这段代码都被抬高了,但也许你可以指出我正确的方向。

谢谢!

编辑 - -

这是我现有用户文件中的内容的示例....

allyson.knanishu
amy.curtiss
amy.hunter
amy.schelker
andrea.vallejo
angel.bender
angie.loebach

这是我的新用户文件中的示例....

aimee.neece,aimee,neece,aimee.neece@faculty.asdf.org,aimee neece,aimee neece,"CN=aimee neece,OU=Imported,dc=Faculty,dc=asdf,dc=org"
alexis.andrews,alexis,andrews,alexis.andrews@faculty.asdf.org,alexis andrews,alexis andrews,"CN=alexis andrews,OU=Imported,dc=Faculty,dc=asdf,dc=org"
alice.lee,alice,lee,alice.lee@faculty.asdf.org,alice lee,alice lee,"CN=alice lee,OU=Imported,dc=Faculty,dc=asdf,dc=org"
allyson.knanishu,allyson,knanishu,allyson.knanishu@faculty.asdf.org,allyson knanishu,allyson knanishu,"CN=allyson knanishu,OU=Imported,dc=Faculty,dc=asdf,dc=org"

来自@mikebabcock 的新代码......谢谢。

outfile = file("result-file.txt", "w")
lines_to_check_for = [ parser(line) for line in file("existing-user.txt", "r") ]
for line in file("new-user.txt", "r"):
    if not parser(line) in lines_to_check_for:
        outfile.write(line)

为解析器添加了导入语句...我收到以下错误...

C:\temp\ad-import\test-files>python new-script.py
Traceback (most recent call last):
  File "new-script.py", line 7, in <module>
    lines_to_check_for = [ parser(line) for line in file("existing-user.txt", "r
     ") ]
  TypeError: 'module' object is not callable

谢谢!

4

3 回答 3

3

假设我明白你想做什么....使用设置交集:)

for line in newlines:
    if set(line.split()) & set(xlines): #set intersection
        print "overlap between xlines and current line"
        break
    else:
        fileresult.write(item)
于 2012-10-15T19:02:17.963 回答
1

如果输入文件格式是每行有一个项目(以便检查 readlines 列表中的现有元素是可以的),那么您正在寻找列表成员资格测试:

if item in xlines:
    break

再指出一些 python 的东西:从您测试成员资格的列表中创建一个集合(因为测试将是对数时间,而不是列表中的线性时间):

xlines = set(filexists.readlines())

此外,您可以使用 with 语句来避免关闭文件并提供更清晰的代码(如这里的第一个示例)。

于 2012-10-15T19:10:27.243 回答
0

我想这是你想要做的:

outfile = file("outfile.txt", "w")
lines_to_check_for = [ line for line in file("list.txt", "r") ]
for line in file("testing.txt", "r"):
    if not line in lines_to_check_for:
        outfile.write(line)

这会将所有行读list.txt入一个数组,然后testing.txt对照该数组检查每一行。所有不在该数组中的行都将被写入outfile.txt.

这是基于您的新问题的更新示例:

newusers = file("newusers.txt", "w")
existing_users = [ line for line in file("users.txt", "r") ]
for line in file("testing.txt", "r"):
    # grab each comma-separated user, take the portion left of the @, if any
    new_users = [ entry.split["@"](0) for entry in line.split(",") ]
    for user in new_users:
        if not user in existing_users:
            newusers.write(user)
于 2012-10-15T19:02:20.067 回答