用于查找特定参数的Python代码

时间:2014-05-23 23:58:55

标签: python

项目I已经工作了一段时间。它正在使用ACL,不幸的是,野兽的性质是不可能的,因此我将提供尽可能多的细节而不给予任何东西。任何帮助是极大的赞赏!

我一直坚持自己找到解决方案,但我担心我只是不知道足够的Python来达到预期的效果。我已经在批处理,PowerShell甚至Bash中实现了这个结果......它只是没有在网络路径上快速运行,而不像我们的其他Python脚本首先在内存中缓冲那么快速工作顺利请注意,这将对超过500K-5M的数据进行筛选。

sampledata.csv

GROUPS,PATH,EXPLICIT,STUFF
Group1,folder0,Explicit,somestuffhere
Group2,folder0,Explicit,somestuffhere
Group1,folder0\coolbeans,Implicit,somestuffhere
Group2,folder0\coolbeans,Implicit,Somestuffhere
Group3,folder0\coolbeans\awesomesauce,Implicit,Somestuffhere
Group3,folder1,Explicit,Somestuffhere
Group4,folder1\awesome,Implicit,Somestuffhere
Group5,folder1\awesome,Implicit,Somestuffhere

概念:

  • 生成显式存在的每个组的列表。

  • 生成隐含存在的每个组的列表。

  • 两个列表都是唯一的(删除重复项)

  • 比较两个列表,对于非显式的Inlicit组。

  • 按剩余的组过滤整个文件内容:

  • 将剩余组整行的每一行输出到单个文件。

理论:

  • 查找Microsoft的Move-to-Network(拖放)文件夹继承问题。

我知道这不仅会帮助自己,也会帮助许多其他人寻求这一挑战。

提前感谢您的帮助!

附加说明:Python版本2.6.6

根据管理员请求我之前使用的代码示例:如前所述。

    import csv
    import sys
    global exp
    global imp
    exp = set()
    imp = set()
    exc = set()
    i = open(sys.argv[1], "rb")
    csvr = csv.reader(i)

    def expparse(target):
        if "Explicit" in target:
            exp.add(target[0])

    def impparse(target):
        if "Implicit" in target:
            imp.add(target[0])


    if __name__ == "__main__":
        for rows in csvr:
            expparse(rows)
            impparse(rows)

    exc = imp - exp # added with aid of Joran - Lack of knowledge to compare 2 Sets.
    for rows in (exc):
        print rows # Produces the right information, how do I set it as a filter?

到目前为止,我仍然不确定如何比较整个CSV中的异常。我的目的是看看其他人会产生什么类型的代码无偏见。我希望看到有更多python经验的人有什么想法,如果通过保持不偏不倚有意义。

反过来,如何让python抓住每一行匹配exc集合中的行?

谢谢!

2 个答案:

答案 0 :(得分:1)

groups_explicit,groups_implicit = set(),set)_
with open(some_csv) as f:
    for line in f:
        if "Explicit" in line:
           groups_explicit.add(line.split(",",1)[0]) 
        elif "Implicit" in line:
           else groups_implicit.add(line.split(",",1)[0])
# use set difference to tell which groups are in implicit but not explicit
implicit_groups_not_in_explicit = groups_implicit - groups_explicit

可能就是你要找的......很难说

答案 1 :(得分:1)

import csv
from itertools import izip, tee

INPUT = "some.csv"
OUTPUT = "filtered.csv"

implicit_groups = dict()
explicit_groups = set()

with open(INPUT, "rb") as inf:
    lines, to_rows = tee(inf)
    rows = csv.reader(to_rows)
    for line, row in izip(lines, rows):
        group, _, state, _ = row
        if state == "Explicit":
            implicit_groups.pop(group, None)
            explicit_groups.add(group)
        elif state == "Implicit":
            if group not in explicit_groups:
                implicit_groups[group] = line

with open(OUTPUT, "wb") as outf:
    # edit!  writing lines, not rows:
    outf.write("\n".join(implicit_groups.itervalues()))