Skip to main content
 首页 » 编程设计

Python文件大小与数组不同

2025年05月04日9pander-it

另一个 python 问题...我正在编写一个脚本,用于扫描文本文件数组并计算文本中四字母的相对频率(请参阅 http://en.wikipedia.org/wiki/Tetragraph )。此代码的目的是集成到自动替换密码求解器中。

我的代码似乎可以正常工作 - 它正确地扫描了所有文本行并进行了适当的计算。我遇到的问题是将数组保存到文件中,然后重新加载它。假设一个包含 26 个字符 (A-Z) 的字母表,则四字母数组应为 26 ^ 4 = 456976,因此生成的文件大小应为 456976 字节。然而,我的代码似乎正在创建一个 456972 字节的文件,这 4 个字节太小了。我的第一个问题是写入字节的循环中的索引问题,但是注释掉的打印语句告诉我循环似乎执行了正确的次数。

谁能给我指出正确的方向?谢谢!

代码:

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)) 

请您参考如下方法:

问题很可能是由 unicode 字符导致长度测量错误引起的。 unicode 字符串上的 len() 函数为您提供组合字符后的代码点数(例如“变音符号”和“O”一起算作一个字符)。 byte order mark也可以解释四个字节的差异。

已发布代码中的 u''.join() 暗示 unicode 问题可能是长度测量差异的根源。