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