项目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组。
按剩余的组过滤整个文件内容:
将剩余组整行的每一行输出到单个文件。
理论:
我知道这不仅会帮助自己,也会帮助许多其他人寻求这一挑战。
提前感谢您的帮助!
附加说明: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集合中的行?
谢谢!
答案 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()))