Скремблирование букв в текстовом файле

Я готовлю тестовые данные, которые должны иметь разные буквы, скажем, அ-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))
Другие вопросы по тегам