【问题标题】:Passing an open file from one function to another将打开的文件从一个函数传递到另一个函数
【发布时间】:2016-03-01 13:32:46
【问题描述】:

我是 python 初学者,所以请耐心等待。我在 GUI 上编写了一些代码,允许用户使用一个按钮 (browse_inputfile) 选择文件,然后显示文件路径,然后用户可以单击另一个按钮对该文件运行转换 (run_conversion)。

但是,为了做到这一点,我必须定义一个全局变量,以使打开的文件能够从一个函数传递到另一个函数。有一个更好的方法吗?我尝试传递路径并在第二个函数中实际打开它,但这会产生“找不到文件”错误,我认为是由于字符串路径中使用了“\”。

这是我的代码:

def browse_inputfile(self):
       global inputfile
       inputfile = open(QtGui.QFileDialog.getOpenFileName(self, "Open Data File", "", "txt files (*.txt)"),'r+')`

然后有一些代码使用“inputfile.name”显示路径。

第二个函数是这样的:

def run_conversion(self):
   global inputfile     
   if inputfile: # if user didn't pick a file don't continue
      #do stuff
      inputfile.close()

我知道使用全局变量不是一个好习惯,那么我怎样才能将打开的文件从一个函数传递到另一个函数并让用户在文件上运行“东西”之前单击第二个按钮?

我希望他们能够在对其进行“处理”之前检查它是否是正确的文件。

谢谢

【问题讨论】:

  • 约定是使用全局变量不是好的做法。我觉得这种说法不合理,只是因为有时你只需要使用它们。特别是在您想在函数之间传递文件名的情况下。全局变量的问题在于它们可能相当危险,因为它们会与重复的变量名混淆。祝你好运!在我看来你很好:)
  • 谢谢达米安。我想知道是否可能是这种情况。但是,可能有一种方法可以传递路径(作为返回?然后在第二个函数中定义变量)a 但是当我尝试不将其设为全局变量但我不知道时,我无法使其工作许多内置的python函数,所以我可能错过了一些东西。
  • 是的,您可以在函数中传递它,但这只会造成比实际价值更多的混乱。只是为了方便而坚持你所拥有的。
  • browse_inputfile()run_conversion() 在同一个班级?
  • 是的,他们在同一个班级。

标签: python function file file-handling


【解决方案1】:

使用inputfile作为类的字段,这样就不需要将文件作为参数传递或使用全局。

class MyClass:
    def browse_inputfile(self):
        self.inputfile = open(QtGui.QFileDialog.getOpenFileName(self, "Open Data File", "", "txt files (*.txt)"),'r+')`
        # you code for display the path


    def run_conversion(self):
        if self.inputfile: # if user didn't pick a file don't continue
            #do stuff
            self.inputfile.close()

【讨论】:

  • 谢谢。这正是我所希望的。这是我自 Coursera 课程以来的第一次编程课程,所以想养成正确的习惯。
【解决方案2】:

您当前的方法存在inputfile 在退出时未关闭的风险。我会做这样的事情:

file_path = None

def browse_inputfile(self):
       return QtGui.QFileDialog.getOpenFileName(self, 'Openfile', '/home')

def run_conversion(self, path):    
   if path: # if user didn't pick a file don't continue
      with open(path) as f:
          #do stuff

如果您想稳健地操作文件名,请使用 os.path 模块 https://docs.python.org/2/library/os.path.html 中的函数。

【讨论】:

  • 谢谢,我会记住这一点以供将来参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
相关资源
最近更新 更多