Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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_Python 2.7 - Fatal编程技术网

Python 如何删除两个文件中相同的单词?

Python 如何删除两个文件中相同的单词?,python,python-2.7,Python,Python 2.7,我有两个文本文件 file1.txt具有: gedit google chrome git vim foo bar firefox svn foo vim file2.txt具有: gedit google chrome git vim foo bar firefox svn foo vim 如何编写一个脚本,在执行时(使用file1.txt和file2.txt作为参数)检查每行中的文本重复(我的意思是它应该按行处理),删除两个文件中的重复文本 所以在处理之后,file1.txt和fil

我有两个文本文件

file1.txt具有:

gedit
google chrome
git
vim
foo
bar
firefox
svn
foo
vim
file2.txt具有:

gedit
google chrome
git
vim
foo
bar
firefox
svn
foo
vim
如何编写一个脚本,在执行时(使用file1.txt和file2.txt作为参数)检查每行中的文本重复(我的意思是它应该按行处理),删除两个文件中的重复文本

所以在处理之后,file1.txt和file2.txt都应该有以下内容:

gedit
google chrome
git
bar
firefox
svn
请注意,
foo
vim
已从这两个文件中删除


有什么指导吗?

是否将过滤后的文件另存为第三个文件

无论如何,在每个文件上进行两个循环,并将每个循环索引值与另一个循环索引值进行比较,如果它们相等,则分别删除和移动。伪代码:

Def func(File a, File b):
 for i in a: 
    for j in b:
      if a[i]==b[j]:
        copy and move
      endif
     endfor
  endfor

如果我正确理解你的问题,那应该很容易

alist = []
for i in ifile1:
    alist.append(i)

for i in ifile2:
    if i in alist:
        alist.remove(i)
    else:
        alist.append(i)

for i in alist:
    print i
现在两个文件都包含:

svn
git
firefox
gedit
google chrome
bar

让我们从输入文件名开始:

files = ('raz.txt','dwa.txt')
和一些辅助函数。这是一个从文件中读取所有单词的生成器

def read(filename):
    with open(filename) as f:
        for line in f:
            if len(line)>0:
                yield line.strip()
这会向文件写入一个序列

def write(filename, lines):
    with open(filename, 'w') as f:
        f.write('\n'.join(lines))
因此,让我们创建两个生成器-每个输入文件一个

words = [read(filename) for filename in files]
然后,让我们将生成器列表转换为集合列表

wordSets = map(set, words)
现在我们有一个2组的列表,其中只包含每个文件中的唯一单词

让我们创建另一个集合,该集合包含所有输入文件中的单词,方法是将它们的集合相交:

commonWords = set.intersection(*wordSets)
是时候重写了

for filename in files:
由于我们想要保存到完全相同的文件,不幸的是,我们需要首先将其全部内容读取到内存中,然后从内存中写入。(如果希望在不同的文件中输出,则不必缓冲该文件

def write(filename, lines):
    with open(filename, 'w') as f:
        f.write('\n'.join(lines))
让我们创建一个读卡器生成器,然后用
list()
将其包装到内存中:

然后按顺序将单词写回给定的文件,但前提是它们不是普通单词

    write(filename, (word for word in lines if word not in commonWords))

输入:

raz.txt

gedit
google chrome
git
vim
foo
bar
gedit
google chrome
git
bar
dwa.txt

firefox
svn
foo
vim
firefox
svn
输出:

raz.txt

gedit
google chrome
git
vim
foo
bar
gedit
google chrome
git
bar
dwa.txt

firefox
svn
foo
vim
firefox
svn

重复项已从这两个文件中删除。

如果文件足够小,可以放入内存,这将完成以下工作:

with open("file1.txt", "r") as f1, open("file2.txt", "r") as f2:
    # create a set from the bigger file 
    result = set(x.strip() for x in f1.readlines())
    # remove duplicates or add unique values from 2nd file
    for line in f2:
        line = line.strip()
        if line in result:
            result.remove(line)
        else:
            result.add(line)
result = "\n".join(result)

# for debug, don't replace original files
with open("file1_out.txt", "w") as f1, open("file2_out.txt", "w") as f2:
    f1.write(result)
    f2.write(result)

# if not inside a function, free memory explicitly  
del result 
对于Python 2.7+,在何处引入

>>> from collections import Counter
>>> file_1 = ['gedit','google chrome','git','vim','foo','bar']
>>> file_2 = ['firefox','svn','foo','vim']
>>> de_dup = [i for i,c in Counter(file_1+file_2).itertimes() if c == 1]
>>> de_dup
['svn', 'git', 'bar', 'gedit', 'google chrome', 'firefox']

为什么有两个文件具有相同的内容?这些文件有多大?当两个文件同时打开时,它们能放入内存吗?+到目前为止?尝试使用set()数据结构查找重复的文件。@deathApril假设我正在重新安装我的Ubuntu。所以我通过
dpkg--get selection
命令(file1.txt)得到一个包列表还有一个由我自己制作的列表(file2.txt),此文件包含我记得的安装内容。在重新安装Ubuntu后,我通过查看file2.txt安装了软件。现在需要安装这两个文件的剩余内容。现在剩下的部分在我的问题中…始终尝试为每个单独的任务考虑正确的数据类型。如果成功,您的方法将被消除。下面的最简单的方法是寻找能够满足您的需求(以及内部函数的需求)的现有数据类型:麻烦最少,效果最好。内容的顺序重要吗?不,我希望从两个文件中删除重复的数据类型(在两个文件中进行修改)如果你有大量数据,.set将是一种更好的方法。+1很好地处理了对称差异(
file1^file2
set()
做什么?@SantoshKumar set从iterable/迭代器返回唯一的项。很抱歉-1,但我发现这篇文章不可读-
;注释可能会有所帮助