遍历目录中的文件并将文件名用作变量,并将文件路径分配给变量

Posted

技术标签:

【中文标题】遍历目录中的文件并将文件名用作变量,并将文件路径分配给变量【英文标题】:iterate over files in directory and use file names as variables, and assign the file path to the variable 【发布时间】:2020-01-05 06:46:39 【问题描述】:

我试图遍历一个文件夹并使用 Pyspark 在 DataBricks 中获取文件的名称和这些文件的路径。 突然想到如果我们可以将文件名作为变量并将路径分配给相应的名为变量的文件。 我们可以使用 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)

提前致谢

【问题讨论】:

***.com/questions/19122345/… 的可能重复项。但真正的问题是为什么不使用字典来代替 filename 作为键和 file_path 作为值? 假设我在一个文件夹中有 100 个文件,我只想为单个文件创建一个 DataFrame,如果我要在字典中创建变量,我必须记住字典中的键,如果我获得了带有文件名和分配给它的文件路径的变量,我可以传递变量名并毫不费力地创建整个数据框 不确定您所说的...“记住字典中的键...”是什么意思,但是我认为分配变量也需要内存开销。字典是此类操作的最佳数据结构 - 它紧凑、便携且高效。 好的,谢谢你的建议,我会检查结果并在这里更新,关于利弊 【参考方案1】:

如果您设置为使用文件名的变量分配路径,那么您可以尝试:

...
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)

【讨论】:

12 exec("%s = %s" % (filename, file_path)) SyntaxError: invalid syntax Traceback (last recent call last): File "/databricks/python/lib/python3.7/ site-packages/IPython/core/interactiveshell.py”,第 3296 行,在 run_code exec(code_obj, self.user_global_ns, self.user_ns) 文件“”中,第 12 行,在 exec("% s = %s" % (filename, file_path)) 文件“”,第 1 行 Dept_data.csv = /FileStore/tables/Dept_data.csv ^ SyntaxError: invalid syntax @younus,尝试添加一组额外的引号。我已经编辑了答案以包含这个,但我也玩过这个并且遇到了反斜杠被解释为 unicode 的问题。没有理由以这种方式实现您尝试执行的操作。字典更好。【参考方案2】:

对于 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

【讨论】:

以上是关于遍历目录中的文件并将文件名用作变量,并将文件路径分配给变量的主要内容,如果未能解决你的问题,请参考以下文章

遍历目录树并将日期戳附加到文件名

实现将递归遍历文件,并将文件路径存储到map中且可以进行不同形式的查询,增加,删除等操作

实现将递归遍历文件,并将文件路径存储到map中且可以进行不同形式的查询,增加,删除等操作

如何在linux shell脚本中使用变量遍历路径

列出路径中的所有目录,并将信息保存到文本文件中

遍历文件目录下所有图片并保存到统一路径