2016-06-27 6 views
1

Ich versuche, eine Datei zu anonymisieren, so dass der gesamte Inhalt mit Ausnahme bestimmter Schlüsselwörter durch Kauderwelsch ersetzt wird, aber das Format wird beibehalten (einschließlich Satzzeichen, Länge von String und Großschreibung). Zum Beispiel:Iterieren durch eine Datei und ersetzen Strings, die Anzahl der Zeichen intakt

I am testing this, check it out! This is a keyword: long 
Wow, another line. 

sollten wiederum in:

T ad ehistmg ptrs, erovj qo giw! Tgds ar o qpyeogf: long 
Yeg, rmbjthe yadn. 

Ich versuche, dies in Python zu tun, aber ich habe kein Glück in eine Lösung zu finden. Ich habe versucht, durch Tokenisierung und Schreiben in eine andere Datei zu ersetzen, aber ohne viel Erfolg.

+2

Können Sie den Code posten, den Sie ausprobiert haben und der nicht funktioniert hat? – Andrew

+1

Zeigen Sie, was Sie probiert haben und womit hatten Sie Schwierigkeiten? – alecxe

+0

Sie sagen "anonymisieren". Wenn Sie sicherstellen müssen, dass die geschrubbten Daten nicht wiederhergestellt werden können, insbesondere wenn Sie dazu gesetzlich verpflichtet sind, sollten Sie lieber mit einem Experten sprechen, anstatt sich auf zufällige Internetfremde zu verlassen, die keine haben mehr Ahnung als du. – user2357112

Antwort

1

Zunächst lassen wir die Tatsache unberücksichtigt, dass wir einige Schlüsselwörter beibehalten müssen. Wir werden das später beheben.

Der einfachste Weg, um diese Art von 1-zu-1-Mapping durchzuführen, ist die Methode str.translate. Das string-Modul enthält auch Konstanten, die alle ASCII-Klein- und Großbuchstaben enthalten, und random.shuffle kann verwendet werden, um eine zufällige Permutation zu erhalten.

import string 
import random 

random_caps = list(string.ascii_uppercase) 
random_lows = list(string.ascii_lowercase) 

random.shuffle(random_caps) 
random.shuffle(random_lows) 

all_random_chars = ''.join(random_lows + random_caps) 

translation_table = str.maketrans(string.ascii_letters, all_random_chars) 

with open('the-file-i-want.txt', 'r') as f: 
    contents = f.read() 
    translated_contents = contents.translate(translation_table) 

with open('the-file-i-want.txt', 'w') as f: 
    f.write(translated_contents) 

in Python 2 die str.maketrans ist eine Funktion in dem Modul string anstelle einer statischen Methode von str.

Die translation_table ist eine Zuordnung von Zeichen zu Zeichen, so dass jedes einzelne ASCII-Zeichen einem anderen zugeordnet wird. Die Methode translate wendet diese Tabelle einfach auf jedes Zeichen in der Zeichenfolge an.

Wichtiger Hinweis: die obige Methode ist eigentlich reversible, da jeder Buchstabe seine auf einen eindeutigen anderen Buchstaben zugeordnet. Dies bedeutet, dass es mit einer einfachen Analyse der Häufigkeit der Symbole möglich ist, sie umzukehren.

Wenn Sie dies schwieriger oder unmöglich machen wollen, könnten Sie die translation_table für jede Zeile neu erstellen:

import string 
import random 

random_caps = list(string.ascii_uppercase) 
random_lows = list(string.ascii_lowercase) 

with open('the-file-i-want.txt', 'r') as f: 
    translated_lines = [] 
    for line in f: 
     random.shuffle(random_lows) 
     random.shuffle(random_caps) 
     all_random_chars = ''.join(random_lows + random_caps) 

     translation_table = str.maketrans(string.ascii_letters, all_random_chars) 
     translated_lines.append(line.translate(translation_table)) 

with open('the-file-i-want.txt', 'w') as f: 
    f.writelines(translated_lines) 

Beachten Sie auch, dass Sie die Datei Zeile für Zeile übersetzen und speichern könnte:

with open('the-file-i-want.txt', 'r') as f, open('output.txt', 'w') as o: 
    for line in f: 
     random.shuffle(random_lows) 
     random.shuffle(random_caps) 
     all_random_chars = ''.join(random_lows + random_caps) 

     translation_table = str.maketrans(string.ascii_letters, all_random_chars) 
     o.write(line.translate(translation_table)) 

Das bedeutet, dass Sie riesige Dateien mit diesem Code übersetzen können, sofern die Zeilen selbst nicht wahnsinnig lang sind.


Der Code alle Zeichen oben durcheinander, ohne dass diese Keywords zu berücksichtigen.

Der einfachste Weg, um die Anforderung zu verarbeiten ist einfach für jede Zeile zu prüfen, ob eine von Schlüsselwörtern auftreten und „wieder einsetzen“ es dort:

import re 
import string 
import random 

random_caps = list(string.ascii_uppercase) 
random_lows = list(string.ascii_lowercase) 

keywords = ['long'] # add all the possible keywords in this list 

keyword_regex = re.compile('|'.join(re.escape(word) for word in keywords)) 


with open('the-file-i-want.txt', 'r') as f, open('output.txt', 'w') as o: 
    for line in f: 
     random.shuffle(random_lows) 
     random.shuffle(random_caps) 
     all_random_chars = ''.join(random_lows + random_caps) 

     translation_table = str.maketrans(string.ascii_letters, all_random_chars) 
     matches = keyword_regex.finditer(line) 
     translated_line = list(line.translate(translation_table)) 

     for match in matches: 
      translated_line[match.start():match.end()] = match.group() 

     o.write(''.join(translated_line)) 

Verwendungsbeispiel (die Version verwenden, die Schlüsselwörter prevserves) :

$ echo 'I am testing this, check it out! This is a keyword: long 
Wow, another line.' > the-file-i-want.txt 
$ python3 trans.py 
$ cat output.txt 
M vy hoahitc hfia, ufoum ih pzh! Hfia ia v modjpel: long 
Ltj, fstkwzb hdsz. 

Beachten Sie, wie long beibehalten wird.

+0

@DavidCullen Eine einfache Lösung hinzugefügt. – Bakuriu

+0

Gute Lösung. Ich war bei der Schlüsselwort-Erhaltung steckengeblieben und hatte nicht daran gedacht, einen zweiten Durchlauf so zu verwenden. – jimo337

+0

@ jimo337 Ich denke, es ist die einfachste Lösung und es ist auch ziemlich effizient. Am Ende wäre es schwer, Regex zu schlagen, um diese Keywords zu finden, also wäre die einzige andere Option, zuerst die Schlüsselwörter zu finden und dann nur die Teile zu übersetzen, die keine Schlüsselwörter sind, aber das wäre mühsamer zu tun und ich bezweifle auch, dass es wirklich signifikante Veränderungen in der Leistung erzeugen würde. – Bakuriu

Verwandte Themen