读取文件在中途停止

时间:2013-08-10 22:43:30

标签: python blender

我正在为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())

1 个答案:

答案 0 :(得分: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()