标题:[求助]有关文本文件差集的操作
只看楼主
阿智兄
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2021-3-8
得分:0 
回复 10楼 zyb159357
谢谢回复,这个方法跟手动把其他文件合并后再跟A做差集是一样的,非常慢。
如果每得到的一个差集再跟下一个做差集运算该怎么做呢?
2021-03-20 02:28
zyb159357
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:25
专家分:113
注 册:2021-3-15
得分:18 
#这样试试效果.
def one_data(file):#提取单一文件关注数据  
    for i in open(file):
        yield i.split(":")[1].strip()
            
def Multiple_Data(*files):#提取多个文件关注数据
    for i in files:
        for j in one_data(i):
            yield j

def dataset(*files): #多文件并集
    return set(Multiple_Data(*files))

f1=open("A.txt", "r")
A=f1.readlines()
lst=('B.txt' , 'C.txt' , 'D.txt' , 'E.txt')
B=dataset(*lst)
#B=dataset('B.txt' , 'C.txt' , 'D.txt' , 'E.txt')
with open("new.txt", "w") as c:
    for i in A:
        if i.strip("\n").split(":")[1] not in B: #A的i行后半部分不在B.txt里.
           c.write(i)
f1.close()



[此贴子已经被作者于2021-3-20 14:54编辑过]

2021-03-20 14:37
阿智兄
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2021-3-8
得分:0 
回复 12楼 zyb159357
谢谢回复,
这个意思是A-(B+C+D+E+F),主要是并集后的文件很大了,效率上很低。
如果做成这样
A-B=临时文件M1
临时文件M1-B=临时文件M3
临时文件M3-C=临时文件M4
临时文件M4-D=临时文件M5
...
这样效率会越来越高。
这样不论文件夹中有多少文件效率都不会低。

[此贴子已经被作者于2021-3-20 15:15编辑过]

2021-03-20 15:13
zyb159357
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:25
专家分:113
注 册:2021-3-15
得分:0 
#这个效率应该不错.
def one_data(file):#提取单一文件关注数据  
    for i in open(file):
        yield i.split(":")[1].strip()
            
def Multiple_Data(*files):#提取多个文件关注数据
    for i in files:
        for j in one_data(i):
            yield j

def dataset(*files): #多文件并集
    return set(Multiple_Data(*files))

f1=open("A.txt", "r")
A=f1.readlines()
A_set=dataset("A.txt")
lst=('B.txt' , 'C.txt' , 'D.txt' , 'E.txt')
B=dataset(*lst)
#B=dataset('B.txt' , 'C.txt' , 'D.txt' , 'E.txt')
with open("new.txt", "w") as c:
    B=A_set - B
    for i in A:
        if i.strip("\n").split(":")[1] in B:
           c.write(i)
f1.close()
2021-03-20 15:14
阿智兄
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2021-3-8
得分:0 
回复 14楼 zyb159357
谢谢回复。
由于B,C,D,E,F...每个文件都装有50万行左右的数据,并起来后再跟A(该文件也有10几万行数据)比较,估计真的很难看到结果。
2021-03-20 15:30
zyb159357
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:25
专家分:113
注 册:2021-3-15
得分:0 
回复 14楼 zyb159357
晚点按你的思路搞一下,现在要忙。
2021-03-20 15:36
zyb159357
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:25
专家分:113
注 册:2021-3-15
得分:0 
以下是引用阿智兄在2021-3-20 15:13:21的发言:

谢谢回复,
这个意思是A-(B+C+D+E+F),主要是并集后的文件很大了,效率上很低。
如果做成这样
A-B=临时文件M1
临时文件M1-B=临时文件M3
临时文件M3-C=临时文件M4
临时文件M4-D=临时文件M5
...
这样效率会越来越高。
这样不论文件夹中有多少文件效率都不会低。


#按上面意思做的.  但觉得效率可能没有上面那个高效.
def _filter(A_data,path_file):
    f=open(path_file, "r")
    B=f.read()
    for i in A_data:
        if i.strip("\n").split(":")[1] not in B:
            yield i   
    f.close()


f1=open("A.txt", "r")
A_data=f1.readlines()
for path_file in ("B.txt" , "C.txt"): # D.txt,E.txt.....
    A_data=_filter(A_data,path_file)
with open("./abcdf/save.txt","w") as f:
    for i in  A_data:
        f.write(i)
f1.close()
2021-03-20 18:26
阿智兄
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2021-3-8
得分:0 
回复 17楼 zyb159357
谢谢你的再次耐心回复。
我分析了代码,发现思路跟下面这个思路有所出入。
这行代码如果改为自动逐个载入文件夹中除了A以外的每个文件,跟相应的每次差集后的临时文件再做差集运算,那么临时文件将会越来越小,速度必然会越来越快。
for path_file in ("B.txt" , "C.txt"): # D.txt,E.txt.....

效果如下:
A-B=临时文件M1  (30-4=26)
临时文件M1-B=临时文件M3   (26-7=19)
临时文件M3-C=临时文件M4   (19-5=12)
临时文件M4-D=临时文件M5    (12-4=8)
...


[此贴子已经被作者于2021-3-20 19:53编辑过]

2021-03-20 19:51
zyb159357
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:25
专家分:113
注 册:2021-3-15
得分:0 
以下是引用阿智兄在2021-3-20 19:51:56的发言:

谢谢你的再次耐心回复。
我分析了代码,发现思路跟下面这个思路有所出入。
这行代码如果改为自动逐个载入文件夹中除了A以外的每个文件,跟相应的每次差集后的临时文件再做差集运算,那么临时文件将会越来越小,速度必然会越来越快。
for path_file in ("B.txt" , "C.txt"): # D.txt,E.txt.....

效果如下:
A-B=临时文件M1  (30-4=26)
临时文件M1-B=临时文件M3   (26-7=19)
临时文件M3-C=临时文件M4   (19-5=12)
临时文件M4-D=临时文件M5    (12-4=8)
...


#估计你没读懂代码, A_data就是临时列表,越来越少!
2021-03-20 21:21
阿智兄
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2021-3-8
得分:0 
回复 19楼 zyb159357
谢谢你的再次耐心回复。
这段代码改为自动读取当前文件夹中的文件该怎么改呢?
for path_file in ("B.txt" , "C.txt"): # D.txt,E.txt.....
2021-03-20 22:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505181-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.298936 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved