Python 为什么不能使用同一处理程序多次读取文件?

Python 为什么不能使用同一处理程序多次读取文件?,python,function,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)

我打开了几个文本文件(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?如果我在第一个函数中使用它们,那么在第二个函数中我不会得到任何结果,反之亦然。

可能您正在
点调用中向en读取文件。
补救方法是在校准点云之前将文件搜索回位置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中文本文件最常见的用例是逐行读取,对每行上的数据进行操作——这可能就是YRU代码在这些函数中所做的。问题是,一个文件一旦打开,就拥有一个内部“指针”,指向它被读取的位置,并在下一次调用时从该位置继续读取。您的第一个函数可能是将文件读到底,指针位于文件的末尾。调用第二个函数时,tehre没有什么可读取的


现在,操作系统文件访问有这个“seek”函数,它允许将文件指针放在任意位置——对于文本文件,将其放在开头、结尾或以前存储的位置(在另一个变量中)最有意义。通过使用“0”调用它,并抑制第二个(“whence”)参数,两个文件都会重新缠绕到开头。

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

不幸的是,在第一个函数读取文件后,读取的游标位于文件的末尾,而第二个函数在游标和文件的末尾之间没有要读取的内容

我的建议是:

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

另一种解决方案是在第一次函数调用后,在文件开始处设置读取游标。

而不是传入文件指针,只需使用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)

对于记录,这与
with
语句无关。类似文件的对象是有状态的,如果不将文件指针重置回起始位置(答案中已介绍),则无法连续读取它们两次。当我尝试逐行读取contentf1时,我会得到每个字母。我怎么能逐行读呢?我应该逐行读取文件并将其存储在列表中吗?