读取文件中途停止

2024-06-09 03:50:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为Blender编写一个DirectX导入程序,以便能够打开ascii.x文件。为此,我尝试编写一个好的Python脚本。我对它很陌生,其实我刚开始,但是效果不错,除了一个奇怪的。。。嗯。。。问题:我的.x文件非常大,正好是3263453字节长。我不会把我的全部代码放在这里,只是一些解决方法,这样问题仍然可见,并且在控制台中。在

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

然后我读了文件:

^{pr2}$

但当我再次确认:

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

Tags: 文件代码importreadlineosopenstrt
1条回答
网友
1楼 · 发布于 2024-06-09 03:50:54

readlines返回一个行的列表,因此当您len(t2)时,它将返回文件中的行数和文件的长度。在

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

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

另外,如果文件被编码,rt可能会错误地解释换行符。所以这样做更安全:

^{pr2}$

如果你想要逐行阅读流媒体,那么最好:

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

相关问题 更多 >