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.
Können Sie den Code posten, den Sie ausprobiert haben und der nicht funktioniert hat? – Andrew
Zeigen Sie, was Sie probiert haben und womit hatten Sie Schwierigkeiten? – alecxe
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