另一个python问题......我正在编写一个脚本来扫描文本文件数组并计算文本中四元图的相对频率(参见http://en.wikipedia.org/wiki/Tetragraph)。此代码的目的是集成到自动替换密码求解器中。
我的代码似乎正在运行 - 它正确扫描所有文本行并进行适当的计算。我遇到的问题是将数组保存到文件中然后重新加载它。假设字母为26个字符(A-Z),则四元组数组应为26 ^ 4 = 456976,因此生成的文件大小应为456976字节。然而,我的代码似乎是创建一个456972字节的文件,这个字节太小了4个字节。我的第一个问题是在循环中写入字节的索引问题,但注释掉的print语句告诉我循环似乎执行的次数正确。
任何人都可以指出我正确的方向吗?谢谢!
代码:
def tools_createtetra(infiles, outfile = 'tetra.log', alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', scale = 16):
maxval = 0
alphalen = int(len(alphabet))
tetras = [0] * alphalen
for i in range(alphalen):
tetras[i] = [0] * alphalen
for j in range(alphalen):
tetras[i][j] = [0] * alphalen
for k in range(alphalen):
tetras[i][j][k] = [0] * alphalen
for i in range(len(infiles)):
fp = open(infiles[i])
filetext = fp.read()
filetext = u''.join(c for c in filetext if c in alphabet.join(alphabet.lower())).upper()
for l in range(len(filetext) - 3):
tetras[alphabet.find(filetext[l])][alphabet.find(filetext[l + 1])][alphabet.find(filetext[l + 2])][alphabet.find(filetext[l + 3])] += 1
if tetras[alphabet.find(filetext[l])][alphabet.find(filetext[l + 1])][alphabet.find(filetext[l + 2])][alphabet.find(filetext[l + 3])] > maxval:
maxval = tetras[alphabet.find(filetext[l])][alphabet.find(filetext[l + 1])][alphabet.find(filetext[l + 2])][alphabet.find(filetext[l + 3])]
fp.close()
maxval = int(math.log(maxval))
scalefactor = maxval / scale
fp = open(outfile, "wb")
for i in range(alphalen):
for j in range(alphalen):
for k in range(alphalen):
for l in range(alphalen):
if tetras[i][j][k][l] != 0:
tetras[i][j][k][l] = int(math.log(tetras[i][j][k][l]) / scalefactor)
fp.write(bytes(chr(tetras[i][j][k][l]), 'ascii'))
# print(alphabet[i], alphabet[j], alphabet[k], alphabet[l], ':',tetras[i][j][k][l])
fp.close()
编辑:这是我用来计算文件长度的代码......可能错误在这里?这是我从中获取数据的地方。如果我循环直到len(tetrastring)然后我得到一个索引错误试图加载数组...
fp = open(tetrafile)
tetrastring = fp.read()
fp.close()
print(len(tetrastring))
答案 0 :(得分:1)
问题可能是因为unicode字符丢失长度测量值。 unicode字符串上的 len()函数为您提供组合字符后的代码点数(例如“变音符号”和“O”,它们一起计为单个字符)。 byte order mark也可以说明四个字节的差异。
发布代码中的u''.join()
暗示unicode问题可能是长度测量差异的根源。