Python 迭代目录中的文件并使用文件名作为变量,并将文件路径分配给变量

Python 迭代目录中的文件并使用文件名作为变量,并将文件路径分配给变量,python,pyspark,databricks,directory-structure,azure-databricks,Python,Pyspark,Databricks,Directory Structure,Azure Databricks,我试图通过一个文件夹进行迭代,并使用Pyspark在DataBricks中获取文件名和这些文件的路径。 突然,一个想法出现了,如果我们可以将文件名作为变量,并将路径分配给相应的名为variable的文件。 我们可以使用dbutils创建小部件,并将文件名指定为参数,以使事情变得更简单。 所以我一直在做这个过程,直到得到文件和文件名的路径。 但是我无法理解变量的创建以及在相应的文件名变量中分配相应文件的路径 代码如下: import pandas as pd import os list1 =[]

我试图通过一个文件夹进行迭代,并使用Pyspark在DataBricks中获取文件名和这些文件的路径。 突然,一个想法出现了,如果我们可以将文件名作为变量,并将路径分配给相应的名为variable的文件。 我们可以使用dbutils创建小部件,并将文件名指定为参数,以使事情变得更简单。 所以我一直在做这个过程,直到得到文件和文件名的路径。 但是我无法理解变量的创建以及在相应的文件名变量中分配相应文件的路径 代码如下:

import pandas as pd
import os
list1 =[]
list2 =[]
directory='/dbfs/FileStore/tables'
dir='/FileStore/tables'
for filename in os.listdir(directory):
  if filename.endswith(".csv") or filename.endswith(".txt"):
    file_path=os.path.join(dir, filename)
    print(file_path)
    print(filename)
    list1.append(file_path)
    list2.append(filename)

提前感谢

如果设置了为具有文件名的变量分配路径,则可以尝试:

...
for filename in os.listdir(directory):
  if filename.endswith(".csv") or filename.endswith(".txt"):
    file_path=os.path.join(dir, filename)
    print(file_path)
    print(filename)
    exec("%s = '%s'" % (filename, file_path))
请注意,附加的引号集可以避免语法和名称错误。然而,这一解决方案仍然充满问题。例如,对
exec
的调用似乎将文件路径中的反斜杠作为unicode:

filename = 'file1'
filepath = '\maindir\foo'
exec("%s = '%s'" % (filename, filepath))
file1
'\\maindir\x0coo'
但字典似乎更适合他的情况:

...
filenames_and_paths = {}
for filename in os.listdir(directory):
  if filename.endswith(".csv") or filename.endswith(".txt"):
    file_path=os.path.join(dir, filename)
    print(file_path)
    print(filename)
    filenames_and_paths[filename] = file_path
不确定为什么要为名称和路径创建两个列表,但如果需要,也可以使用字典理解:

filenames_and_paths = {name:path for name,path in zip(list1, list2)}

对于Pyspark,我建议使用Hadoop FS API将文件列为
os。listdir
无法与外部存储桶/存储一起使用

下面是一个您可以调整的示例:

# access hadoop fs via the JVM
Path = sc._gateway.jvm.org.apache.hadoop.fs.Path
conf = sc._jsc.hadoopConfiguration()

# list directory
directory = Path("/dbfs/FileStore/tables/*.csv")
gs = directory.getFileSystem(conf).globStatus(directory)

# create tuples (filename, filepath), you can also filter specific files here...
paths = []
if gs:
    paths = [(f.getPath().getName(), f.getPath().toString()) for f in gs]

for filename, file_path in paths:
    # your process

可能的副本。但真正的问题是为什么不使用字典,而将
文件名
作为键,将
文件路径
作为值?假设我在一个文件夹中有100个文件,我只想为一个文件创建一个数据框,如果我要在字典中创建变量,我必须记住字典中的键,如果我得到了带有文件名的变量和分配给它的文件路径,我就可以毫不费力地传递变量名并创建整个数据帧不知道你所说的“记住字典中的键…”是什么意思,但是分配变量还需要内存开销,我想更多。字典是这类操作的最佳数据结构—它紧凑、可移植且高效。好的,谢谢您的建议,我将在这里检查结果并更新,关于pros和cons12 exec(“%s=%s”%(文件名,文件路径))语法错误:无效语法回溯(最近一次调用最后一次):文件“/databricks/python/lib/python3.7/site packages/IPython/core/interactiveshell.py”,第3296行,在运行代码exec(代码obj、self.user、全局用户、self.user)文件”中,第12行,在exec(“%s=%s”%(文件名、文件路径))文件中”“,第1行Dept_data.csv=/FileStore/tables/Dept_data.csv^语法错误:无效syntax@younus,尝试添加一组附加引号。我对答案进行了编辑,将其包括在内,但我也对其进行了修改,并遇到了反斜杠被解释为unicode的问题。没有理由用这种方式来实现你想做的事情。字典是最好的。