1

我正在为 Blender 编写一个直接 x 导入器,以便能够打开 ascii .x 文件。为此,我尝试制作一个好的 Python 脚本。我对它很陌生,实际上我才刚开始,但得到了很好的结果,除了一个奇怪的......嗯......问题:我的 .x 文件非常大,正好有 3 263 453 字节长。我不会把我的整个代码放在这里,只是一些解决方法,所以问题仍然可见,并且在控制台中。

>>> teszt = open('d:\DRA_ACTORDEF_T0.x','rt')
>>> teszt
<_io.TextIOWrapper name='d:\\DRA_ACTORDEF_T0.x' mode='rt' encoding='cp1250'>

然后我阅读了文件:

>>> t2 = teszt.readlines()
>>> len(t2)
39768

但话又说回来,当我验证时:

>>> import os
>>> os.fstat(teszt.fileno()).st_size
3263453

谁能帮我一把,告诉我,问题是什么?也许我要设置缓冲区大小等?不知道这在 Python 中是如何工作的。

我以与上述相同的方式打开文件,然后使用.readline().

非常感谢。

编辑:

代码简化了。我需要.readline()

fajlnev = 'd:\DRA_ACTORDEF_T0.x'

import bpy
import os

fajl = open(fajlnev, 'rt')
fajl_teljes_merete = os.fstat(fajl.fileno()).st_size

while (fajl.tell() < fajl_teljes_merete):
    print(fajl.tell(),fajl.readline())
4

1 回答 1

1

readlines返回行列表,因此当您执行len(t2)此操作时,将返回文件中的行数和文件的长度。

如果您希望数字匹配,您应该这样做:

with open('your_file', 'rb') as f:
    data = f.read()
print(len(data))

此外,如果文件被编码rt可能会错误地解释换行符。因此,执行以下操作会更安全:

import io
with io.open('your_file', 'r', encoding='your_file_encoding') as f:
    lines = f.readlines()

如果您想要逐行读取流式传输,那么最好这样做:

import io
with io.open('d:\\DRA_ACTORDEF_T0.x', 'r', encoding='your_encoding') as f:
    for line in f:
        print line

这将负责流式传输,而不是将整个文件读入内存。

如果您仍想使用readline

import io
filename = 'd:\\DRA_ACTORDEF_T0.x'
size = os.stat(filename).st_size
with io.open(filename, 'r', encoding='your_encoding') as f:
    while f.tell() < size:
         # Do what you want
         line = f.readline()
于 2013-08-10T23:08:02.720 回答