2016-08-01 5 views
1

削除するデータのリストに基づいて.csvファイルの列にある単語を別の.txtファイルに難読化したいとします。.txtファイルから.csvのデータを難読化する

私のデータの大文字と小文字を無視し、.csvファイルでは、一致する単語を "to remove"ファイルの代わりに'*'に置き換えることが理想的です。大文字と小文字を無視して.csvファイル内の単語を置き換えるのが最善の方法は何か分かりません。私がこれまで行ってきたことは働いておらず、私は解決策に門戸を開いています。

例データファイル:

This is a line of text in .csv column that I want to remove a word from or data such as 123 from. 

私の.txtファイルを削除するデータのリストになります。

want 
remove 
123 

出力は次のようになります。

This is a line of text in .csv column that I **** to ****** a word or data such as *** from. 

私のコード:

import csv 

with open('MyFileName.csv' , 'rb') as csvfile, open ('DataToRemove.txt', 'r') as removetxtfile: 
    reader = csv.reader(csvfile) 
    reader.next() 
    for row in reader: 
     csv_words = row[3].split(" ") #Gets the word for the 4th column in .csv file 
      for line in removetxtfile: 
       for wordtoremove in line.split(): 
        if csv_words.lower() == wordtoremove.lower() 
         csv_words = csv_words.replace(wordtoremove.lower(), '*' * len(csv_words)) 
+1

私はこのコードをあまりにも多くのループに凝縮して非効率の点に凝縮しようとしていると思います。 'row [3] .split(" ")';を使用します。難読化したい_only_単語/フレーズがその列の文章にあることを意味しますか?また、実際の出力は何ですか?ここにあるものはすべて読み込まれますが、他のものは読み込まれません。 – roganjosh

+0

はい、残りのデータ列には難読化したい単語/句がありません。私はこの入れ子ループが効率的ではないと思っていましたが、私はPythonには新しく、より良い方法は何か分かりません。私の実際の出力は、.csvファイルの列のどこかにある私の.txtファイルから(大文字と小文字を区別しない)単語を取り、.csv列の一致する単語を '*'で置き換える必要があります。 – TechPadawan24

答えて

0

私は、一連の検閲語を構築することから始めます。私の入力は、基本的に改行で区切られた単語のプレーンテキストファイルです。テキストファイルが異なる場合は、別々に解析する必要があります。

その他の思考:

入力ファイルを上書きしようとする代わりに、別の検閲ファイル出力を作成します。そうすれば、あなたのアルゴリズムを台無しにするとデータが失われることはありません。

4番目の列に.split(" ")を入力します。これは、複数の単語がスペースで区切られている場合にのみ必要です。そうでない場合は、for w in csv_wordsループをスキップして、4番目の列のすべての単語をループさせることができます。

import csv 
import re 
import string 

PUNCTUATION_SPLIT_REGEX = re.compile(r'[\s{}]+'.format(re.escape(string.punctuation))) 

# construct a set of words to censor 
censor_words = set() 
with open ('DataToRemove.txt', 'r') as removetxtfile: 
    for l in removetxtfile: 
    words = PUNCTUATION_SPLIT_REGEX.split(l) 
    for w in words: 
     censor_words.add(w.strip().lower()) 

with open('MyFileName.csv' , 'rb') as csvfile, open('CensoredFileName.csv', 'w') as f: 
    reader = csv.reader(csvfile) 
    # reader.next() 
    for row in reader: 
     csv_words = row[3].split(' ') #Gets the word for the 4th column in .csv file 
     new_column = [] 
     for w in csv_words: 
      if w.lower() in censor_words: 
       new_column.append('*'*len(w)) 
      else: 
       new_column.append(w) 
     row[3] = ' '.join(new_column) 
     f.write(' '.join(row) + '\n') 
+0

句読点をトリミング/無視することについても話したいことはありますか? – RoadieRich

+0

句読点で分割を追加しました。その部分はテストされていませんが、btw ymmv – James

+0

James、これはとても近いです!最後にカンマ区切りを返すように最後の行を変更しました。しかし、4列目のデータには、行の中にコンマや改行が含まれているとは考えられませんでした。代わりに新しいファイルを作成することをあなたが指摘したことは良いことです。カンマ区切りのファイルでアップロードできるようにするには、コンマと改行を含むデータをどのように扱うのが最適な方法でしょうか? – TechPadawan24

関連する問題