1

私は2つのテキストファイルを持っています。

file1.txtは次のとおりです。

gedit
google chrome
git
vim
foo
bar

file2.txtは次のとおりです。

firefox
svn
foo
vim

(引数としてfile1.txtfile2.txtを使用して) 実行すると、各行のテキストの重複をチェックし(行ごとに処理する必要があることを意味します)、両方のファイルの重複したテキストを削除するスクリプトを作成するにはどうすればよいですか。

したがって、処理後、file1.txtfile2.txtの両方に次の内容が含まれているはずです。

gedit
google chrome
git
bar
firefox
svn

foovimが両方のファイルから削除されていることに注意してください。

ガイダンスはありますか?

4

6 に答える 6

3
with open('file1.txt','r+') as f1 ,open('file2.txt','r+') as f2:
    file1=set(x.strip() for x in f1 if x.strip())
    file2=set(x.strip() for x in f2 if x.strip())
    newfile=file1.symmetric_difference(file2) #symmetric difference removes those values which are present in both sets, and returns a new set.
    f2.truncate(0) #truncate the file to 0 bytes
    f1.truncate(0)
    f2.seek(0) # to push the cursor back to the starting pointing in the file.
    f1.seek(0)
    for x in newfile:
        f1.write(x+'\n')
        f2.write(x+'\n')

現在、両方のファイルに次のものが含まれています。

svn
git
firefox
gedit
google chrome
bar
于 2012-06-23T10:25:00.323 に答える
0

ファイルがメモリに収まるように適度に小さい場合、これは仕事をします:

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 
于 2012-06-23T10:28:30.307 に答える
0

Counter導入されたPython2.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']
于 2012-06-23T10:33:30.513 に答える
0

フィルタリングされたファイルを 3 番目のファイルとして保存しますか?

とにかく、各ファイルに対して 2 つのループを作成し、各ループ インデックス値を他のループ インデックス値と比較し、それらが等しい場合は、削除して慎重に移動します。擬似コード:

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
于 2012-06-23T09:59:39.937 に答える
0

私があなたの質問を正しく理解していれば、それは簡単なはずです。

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
于 2012-06-23T10:00:45.917 に答える
-1

入力ファイル名から始めましょう:

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))

それでは、2つのジェネレーターを作成しましょう-入力ファイルごとに1つ

words = [read(filename) for filename in files]

次に、そのジェネレータのリストをセットのリストに変換しましょう

wordSets = map(set, words)

これで、各ファイルの一意の単語のみを含む2セットのリストができました。

セットを交差させることにより、すべての入力ファイルに存在する単語を含む別のセットを作成しましょう。

commonWords = set.intersection(*wordSets)

そして書き直しの時間。

for filename in files:

まったく同じファイルに保存したいので、残念ながら、最初にその内容全体をメモリに読み取り、次にそこから書き込む必要があります。(別のファイルで出力したい場合は、ファイルをバッファリングする必要はありません。

リーダージェネレーターを作成し、それを次のようにラップしてすべてをメモリに読み込みますlist()

    lines = list(read(filename))

次に、単語を指定されたファイルに順番に書き戻しますが、commonWordsにない場合に限ります。

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

入力:

raz.txt

gedit
google chrome
git
vim
foo
bar

dwa.txt

firefox
svn
foo
vim

出力:

raz.txt

gedit
google chrome
git
bar

dwa.txt

firefox
svn

重複は両方から削除されました。

于 2012-06-23T10:26:23.667 に答える