Скремблирование букв в текстовом файле
Я готовлю тестовые данные, которые должны иметь разные буквы, скажем, அ-20 раз, ம-30 раз, த-40 раз.....(Это буквы тамильского языка, поддерживаемые кодировкой UTF-8). Этого можно достичь с помощью оператора печати.
{print ( ' ம் ' * 30 ) + ( ' த ' * 40 ) + }
Но мне нужно зашифровать их, чтобы они не появлялись в каком-то определенном порядке. У меня около 230+ писем, которые я буду печатать 20,30,40 раз. И тогда мне нужно зашифровать их и записать их в выходной файл. Любая помощь в этом отношении будет полезна.
4 ответа
Благодарности моему другу @AswinMurugesh, который помог мне с кодом.
Следующий код сделал свое дело.
import codecs
import tamil
from random import shuffle
inp_file = codecs.open("/home/sibi/Desktop/scramble.txt",encoding="utf-8")
inp_text = inp_file.read().rstrip()
tamil_letters = tamil.utf8.get_letters(inp_text)
shuffle(tamil_letters)
tamil_letters = "".join(tamil_letters).encode("utf-8")
print tamil_letters
out_file = open('outputscrambled.txt','w')
out_file.write(tamil_letters)
Есть несколько способов, которыми вы могли бы пойти по этому поводу. Наиболее эффективным будет использование random
модуль.
random.shuffle
>>> from random import shuffle
>>> my_string = list('This is a test string.')
>>> shuffle(my_string)
>>> scrambled = ''.join(my_string)
>>> print(scrambled)
.sTtha te s rtisns gii
Для этого вы должны создать list
из символов строки, потому что строки неизменны.
Новый объект должен быть создан, если нужно сохранить другое значение.
random.sample
>>> from random import sample
>>> my_string = 'This is a test string.'
>>> scrambled = random.sample(my_string, len(my_string))
>>> scrambled = ''.join(scrambled)
>>> print(scrambled)
gr.s i tisstheit Tn sa
Вам не нужно создавать list
за это; потому что из random.sample
документация:
Возвращает новый список, содержащий элементы из совокупности, оставляя исходную совокупность без изменений.
sorted
встроенный с random.random
>>> from random import random
>>> my_string = 'This is a test string.'
>>> scrambled = sorted(my_string, key=lambda i: random())
>>> scrambled = ''.join(scrambled)
>>> print(scrambled)
ngi rts ithsT.staie s
Вам не нужен list
для этого тоже. От sorted
документация:
Вернуть новый отсортированный список из элементов в итерируемых.
Поскольку строка рассматривается в Python как итеративная (см. Ниже), sorted
можно использовать на нем.
Итерируемый определяется как
Объект, способный возвращать своих членов по одному.
Я предлагаю разбить эту проблему на 3 части: собрать список букв, перемешать список, а затем записать его в файл. Обратите внимание, что первая строка в следующем коде должна быть в верхней части вашего файла Python, чтобы вы могли использовать символы utf-8 в самом исходном коде.
# -*- coding: utf-8 -*-
import codecs # To write UTF-8 characters to a file
import random
# Assemble data list
letters = [u'அ', u'ம', u'த']
data = [] # This list will hold the shuffled data
for current_letter in letters:
# Choose how many times to repeat the current letter.
times_repeated = random.choice([20, 30, 40])
data.extend([current_letter] * times_repeated)
# Now, shuffle the 'data' list
random.shuffle(data)
# Now write the shuffled list to a file as one continuous string
data_string = "".join(data)
with codecs.open("data.txt", "w", "utf-8") as f:
f.write(data_string)
Обратите внимание, что если вы знаете, сколько раз вы хотите, чтобы каждая буква отображалась, вы можете поместить эту информацию в словарь вместо случайного выбора из [20, 30, 40]
:
# The key is the letter to repeat, the value is the number of times to repeat it
letters = {u'அ': 20,
u'ம': 30,
u'த': 20}
for letter in letters:
times_repeated = letters[letter]
# ... rest of the code would look the same ...
Просто используйте random.choice:
import random
size = 1000
values = [' ம் ', ' த ', ' த ']
print "".join(random.choice(values) for i in xrange(size))