我有一个包含第一个和最后一个'syllables'的文本文件,用[part1]和[part2]划分:
[part1] Ae Di Mo Fam [part2] dar kil glar tres
我想做的就是在[part1]和[part2]之间选择一条随机线,然后在[part2]和文件末尾之间选择另一条随机线,并将两者连接在一起(例如“Aedar”, “Moglar”)创建随机名称。
但是我不确定如何使用readline()有效地解析文本文件。有没有比顺序扫描每一行更好的方法,并将所有这些存储在一个列表中,从那里我可以选择一个随机元素?
答案 0 :(得分:11)
将字典序列化(pickle)改为文件。
示例:
# create the dict and save it to a file
d={
'part1':[
'Ae',
'Di',
'Mo',
'Fam',],
'part2':[
'dar',
'kil',
'glar',
'tres',],
}
import pickle
f=open('syllables','w')
pickle.dump(d,f)
f.close()
# read the dict back in from the file
f1=open('syllables','r')
sd=pickle.load(f1)
f1.close()
import random
first_part=sd['part1'][random.randint(0,len(sd['part1'])-1)]
second_part=sd['part2'][random.randint(0,len(sd['part2'])-1)]
print '%s%s'%(first_part,second_part)
答案 1 :(得分:5)
import random
parts = {}
with open('parts.txt', 'r') as f:
currentList = []
for line in f.readlines():
line = line.strip()
if line.startswith('[') and line.endswith(']'):
currentList = []
parts[line[1:-1]] = currentList
else:
currentList.append(line.strip())
for i in xrange(10):
print ''.join(random.choice(parts[partName]) for partName in sorted(parts))
返回(随机):
Aekil
Didar
Mokil
Mokil
Moglar
Moglar
Diglar
Famdar
Famdar
Modar
答案 2 :(得分:3)
除非您事先知道有多少前缀和后缀,否则您必须在某个时刻读取整个文件。因为我假设你没有,或者它可以改变而且你不想保存一个用于存储它的数字,你将不得不通读该文件,而readline()是一种很好的方法。< / p>
但是,您可以预处理文本文件,以便它使用其他格式,例如pickle文件。换句话说,将文本文件读入字典,然后挑选该字典。字典可能看起来像这样:
dic = {'prefixes': ['Ae' ,'di', ...],
'suffixes': ['dar', 'kil', ...]}
从数组的长度,您可以确定最大随机数是多少。它应该比每次逐行读取整个文件更有效。如果没有,至少它是一个更优雅的解决方案。
答案 3 :(得分:1)
修改后的@eumiro's script:
#!/usr/bin/env python
import fileinput
import random
import re
from collections import defaultdict
partname = ''
parts = defaultdict(list)
for line in fileinput.input():
line = line.rstrip()
if line.startswith('[') and re.match(r'\[part\d+\]', line):
partname = line
else:
parts[partname].append(line)
parts_list = list(map(parts.get, sorted(parts)))
for _ in range(10):
print(''.join(map(random.choice, parts_list)))
Famglar
Famkil
Didar
Ditres
Aedar
Famglar
Ditres
Famtres
Ditres
Modar