为什么使用相同的处理程序无法多次读取文件?

时间:2016-10-26 11:49:29

标签: python function

我打开几个文本文件(STL)并使用之前定义的两个函数对它们运行几个操作。准确地说,函数“point_stl”提取STL文件中包含的点的坐标,而函数“point_cloud”从STL文件中提取点而不重复。

with open(folder+"bone_set1.stl", "r") as f1, open(folder+"bone_set2.stl", "r") as f2:
    var1 = point_stl(f1,f2)
    var2 = point_cloud(f1,f2)

为什么看起来我不能使用两次变量f1和f2?如果我在第一个函数中使用它们,我在第二个函数中没有得到任何结果,反之亦然。

3 个答案:

答案 0 :(得分:5)

您正在阅读point_stl来电中的en文件。 解决方法是在加注point_cloud之前将文件重新找回位置0:

with open(folder+"bone_set1.stl", "r") as f1, open(folder+"bone_set2.stl", "r") as f2:
    var1 = point_stl(f1,f2)
    f1.seek(0)
    f2.seek(0)
    var2 = point_cloud(f1,f2)

更好地理解:Python中文本文件的最常见用例是逐行读取,对每行上的数据进行操作 - 这可能是yoru代码在这些函数中的作用。问题是一个文件一旦打开,就会保持一个内部“指针”指向它被读取的位置,以及它将在下一次调用时从哪个地方继续读取。您的第一个函数可能是将文件读取到最后,指针位于文件的末尾。在调用第二个函数时,tehre没有什么可读的。

现在,操作系统文件访问具有这种“搜索”功能,允许将文件指针放在任意位置 - 对于文本文件,将它放在开头,结尾处或在先前存储的位置(在另一个变量中)。通过用“0”调用它,并抑制第二个(“whence”)参数,两个文件都被重新卷绕到开头。

答案 1 :(得分:4)

而不是传入文件指针,只需使用f.read()并传入文件内容

with open(folder+"bone_set1.stl", "r") as f1, open(folder+"bone_set2.stl", "r") as f2:
    contentsf1 = f1.read()
    contentsf2 = f2.read()
    var1 = point_stl(contentsf1,contentsf2)
    var2 = point_cloud(contentsf1,contentsf2)

答案 2 :(得分:2)

由于您直接传递文件处理程序,我假设每个函数都读取文件内容。

不幸的是,在第一个函数读取文件后,读取的游标位于文件末尾,第二个函数在游标和文件末尾之间无法读取。

我的建议是

  • 首先阅读函数外部的文件(在调用它们之前)
  • 然后将文件内容传递给函数而不是文件处理程序。

另一个解决方案是在第一次函数调用之后的文件中设置读取游标。