在文本文件中加扰字母

时间:2015-04-15 17:28:22

标签: python string scramble

我正在准备一个测试数据,必须有不同的字母说அ-20倍 ம-30次,த-40次.....(它们是UTF-8编码支持的泰米尔语言字母) 这可以使用打印声明来实现

{print ( ' ம் ' * 30 ) + ( ' த ' * 40  ) + }

但是,我需要加扰他们,以便他们不会以任何特定的顺序出现。我有大约230多封信,我将打印20,30,40次。然后我需要加扰它们并将它们写入输出文件。 在这方面的任何帮助都会有所帮助。

4 个答案:

答案 0 :(得分:3)

有很多方法可以解决这个问题。最有效的方法是使用random module

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,因为字符串为immutable

  

如果必须存储不同的值,则必须创建新对象。

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文档:

  

返回一个包含来自总体的元素的新列表,同时保持原始总体不变。

The sorted built-in 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文档:

  

从iterable中的项目返回一个新的排序列表。

由于Python中的字符串被视为iterable(见下文),因此可以使用sorted

可迭代定义为

  

一个能够一次返回其成员的对象。

答案 1 :(得分:2)

我建议将这个问题分成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 ...

答案 2 :(得分:0)

向我的朋友@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)

答案 3 :(得分:-1)

只需使用random.choice

import random
size = 1000
values = [' ம் ', ' த ', ' த ']
print "".join(random.choice(values) for i in xrange(size))