【问题标题】:Access multiple dynamic variables outside for loop - Global keyword in Python在 for 循环之外访问多个动态变量 - Python 中的全局关键字
【发布时间】:2019-12-06 11:00:54
【问题描述】:

我正在使用 for 循环来读取多个 csv 文件并创建数据帧。我也想在 for 循环之外访问这些数据帧。为此我也使用了Global 关键字,但它不起作用。

for file in os.listdir('C:\\Users\\ABCDE\\Desktop\\Measurement'):
  if file.endswith('.csv'):
     print(file)
     name = file[3:6]
     global df_name   # this is the line 
     df_name = 'df' + name  
     print(df_name)
     df_name = pd.read_csv('C:\\Users\\ABCDE\\Desktop\\Measurement\\' + str(file),low_memory = False)
     df_name.rename(columns={0:'values'}, 
             inplace=True)       
     g = df_name.level_1.str[-2:] # Extracting column names
     df_name['lvl'] = df_name.level_1.apply(lambda x: int(''.join(filter(str.isdigit, x))))

正如您在上面看到的,我也想在 for 循环之外访问这些数据帧(df_name(3 个数据帧,因为我有 3 个文件)

如何使用 Global 关键字使这些数据帧在 for 循环之外可访问?

【问题讨论】:

  • 你的 for 循环是否在另一个函数中?如果不是,您甚至不需要使用global。您可以在循环之前定义一个变量,然后在循环中对其进行修改。
  • @BerkayÖz - 我正在从一个目录中读取所有文件。所以,我的目标是为每个数据框设置唯一的变量名。不同文件的数据框名称不同。每个文件都有不同的 datframe 名称。那么在这种情况下,我还应该在外面声明一个变量吗?是推荐的吗?
  • 您在一行中尝试了 2 个操作,这就是它给出错误的原因。而且这不是推荐,您可以在范围之外定义。
  • @AVLES 在这种情况下,您应该声明一个 listdictionary。在循环中创建一个局部变量,将该局部变量用于数据框,然后将该变量添加到您的列表或字典中。
  • @AVLES 正如我之前提到的,您不需要为每个文件创建变量。也不建议这样做,也不是一个好习惯。只需将它们添加到列表或字典中,然后从那里访问它们。

标签: python python-3.x for-loop global-variables global


【解决方案1】:

你需要在函数顶部定义变量名然后使用

a = dataframe

def func():
    global a
    a = yourdataframe

【讨论】:

    【解决方案2】:

    你需要在声明变量后添加一个单独的行使其成为全局变量 像这样的

    df_name = 'df' + name 
    global df_name
    

    【讨论】:

      【解决方案3】:

      我可以理解您想要实现的目标,但不明白您为什么希望您的代码能够正常工作。 'df' + namestring,不是变量;另外,您不会像这样声明外部变量。语法要简单得多,与 pandas 无关。 下面是一个用法示例:

      a = 'foo'
      
      def get_a():
          global a
          return a
      
      def set_a(b):
          global a
          a = b
      
      if __name__ == '__main__':  # Just defining the entry point of the python script
          print(get_a())
          set_a(2)
          print(get_a())
          print(a)
      

      下面是脚本的输出结果:

      'foo'
      2
      2
      

      【讨论】:

      • 是的,我正在使用该字符串作为数据框名称
      • 好的,那么您有三个主要选项:使用globals()['df' + name]、使用getattr(module_where_the_variable_is, 'df' + name)eval('df' + name)。注意最后一个,因为 eval 可以执行任何代码,因此如果暴露在公众面前是有风险的。
      • 我试过全局变量。它不起作用。我只有一个简单的 for 循环,并没有任何功能或多个模块。只是希望该数据框可以在 for 循环之外访问。感谢您的回复和帮助
      • 那么 Berkay Öz 给出的答案最适合您的需求,尽管这个问题非常具有误导性 :)
      • 你能帮我解决这个问题吗? stackoverflow.com/questions/57250943/…
      【解决方案4】:

      在与 cmets 澄清之后,您可以使用 listdictionary 来实现您想要的。

      dataFrames = list()
      dataFrameDict = dict()
      
      for file in os.listdir('C:\\Users\\ABCDE\\Desktop\\Measurement'):
        if file.endswith('.csv'):
           print(file)
           name = file[3:6]
           df_name = pd.read_csv('C:\\Users\\ABCDE\\Desktop\\Measurement\\' + str(file),low_memory = False)
           df_name.rename(columns={0:'values'}, 
                   inplace=True)       
           g = df_name.level_1.str[-2:] # Extracting column names
           df_name['lvl'] = df_name.level_1.apply(lambda x: int(''.join(filter(str.isdigit, x))))
           # ADD TO A LIST
           dataFrames.append(df_name)
           # OR TO A DICT
           dataFramesDict[name] = df_name
      
      
      # How to Access
      
      # Index for 10 files would be 0-9
      index = 0
      dataFrames[index]
      
      # Name of the dataset you want to access
      name = "..."
      dataFrameDict[name]
      

      【讨论】:

      • Oz - 只是想知道,除了使用 list 和 dicts 之外,难道没有在这个 for 循环中使用 global 关键字并能够在 for 循环之外访问它们吗?我也没有任何功能.. 只是一个普通的 for 循环
      • @AVLES 使用global 关键字可让您访问函数体之外的变量。那将只是一个变量。在您的情况下,您需要多个变量,但是如果您使用动态范围的文件,您如何知道需要多少变量。在这种情况下,您不能只描述每个文件的变量。只有 listdictionary 可以处理这个问题。如果您有一个文件,您可以定义一个变量,然后将您的数据框附加到该变量。你不需要使用global
      • Oz - 你能帮我写这篇文章吗? stackoverflow.com/questions/57250943/…
      • 你能帮我解决这个问题吗? stackoverflow.com/questions/57307386/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多