Python文件大小与数组不同

标签 python binaryfiles

另一个 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 问题可能是长度测量差异的根源。

关于Python文件大小与数组不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20646246/

相关文章:

c - 如何从二进制文件读取到 C 中的文本文件?

python - 如何忽略 `or` 语句中 `if` 的错误值

python - np.float 不匹配 np.float32 和 np.float64

c - sizeof(var) 在 C 语言中总是有效吗?

python - 在 Python 中以 ASCII 格式打开二进制文件

python - 简单读取 fortran 二进制数据在 python 中并不那么简单

python - PyWinAuto 仍然有用吗?

python - Scrapy 不响应 CloseSpider 异常

Python包结构

git - 在 Git 中转储二进制文件并恢复?