【问题标题】:Python os.listdir is not giving consistent outputPython os.listdir 没有给出一致的输出
【发布时间】:2019-03-26 08:42:06
【问题描述】:

我在 Linux Ubuntu 18.04 上的 Conda 虚拟环境中使用 Python 3.6.2。

我尝试了几种方法来列出特定路径的文件和目录,但我尝试的每一种方法似乎都只列出目录中的文件,而不是文件和目录。

我的代码包含

directory_contents = os.listdir(run_directory)
print(directory_contents)

只显示

['170224-ARC122-1-uM-Cis-S1-subsample_R1_001.fastq.gz', '170224-ARC122-1-uM-Cis-S1-subsample_R2_001.fastq.gz']

如果我在 listdir 命令之前调用了一个 break,然后单步执行 listdir 命令,则变量将填充正确的内容

ipdb.set_trace()
print(directory_contents)
directory_contents = os.listdir(run_directory)
print(directory_contents)

*** NameError: name 'directory_contents' 未定义

['170224-ARC122-1-uM-Cis-S1-subsample_R1_001.fastq.gz', 'bw', 'Stats', 'bwChrM','bg','170224-ARC122-1-uM-Cis-S1-subsample_R2_001.fastq.gz', 'bgChrM', '日志']

在listdir命令后调用break

directory_contents = os.listdir(run_directory)
ipdb.set_trace()
print(directory_contents)

给予

['170313-ARC122-no-Cis-S5-subsample_R2_001.fastq.gz', '170313-ARC122-no-Cis-S5-subsample_R1_001.fastq.gz']

我不理解什么或者我忽略了哪些额外的关键字/参数?为什么会根据我是在命令之前还是之后中断而得到不同的结果?

这个看似简单的问题似乎不值得提出,但我已经没有解决方案了。

【问题讨论】:

  • 这里没有截图,请复制粘贴格式化后的代码(包括带有break的sn-p)
  • 另外:如果你之前中断,你会在os.listdir(..) 将新内容放入之前获得变量的值,如果你之后中断,你会得到新内容...
  • 我当然应该得到相同的值,无论我是在之前还是之后打破。如果我之前中断并手动运行命令,我会得到 X 值,如果我在看到 X 值之后中断?

标签: python python-3.x listdir


【解决方案1】:

你可以使用 os.walk()的第一个结果:

import os

# demo structure: 5 dirs, 5 files
for n in range(5):
    os.mkdir(f"dir_{n}")

for n in range (10,15):
    with open(f"file_{n}.txt","w") as f:
        f.write("...")

# query
akt_dir, subdirs, files = next(os.walk("./")) # get the first result of the generator
print(akt_dir)
print(subdirs)
print(files)

输出:

./
['dir_0', 'dir_2', 'dir_3', 'dir_4', 'dir_1']
['file_14.txt', 'file_10.txt', 'file_12.txt', 'main.py', 'file_13.txt', 'file_11.txt']

os.walk() 返回一个生成器 - 所以它可能会查询比你想要的更多。

【讨论】:

  • 我仍然只获取 os.walk 尝试的输出中存在的文件。运行 ` for akt_dir, subdirs, files in os.walk(run_directory): print(akt_dir, subdirs, files)`
  • @Liam 然后你应该检查你的确切位置 - 如果你所在的目录中有目录,你会得到它们以及文件。您可能想检查您的“目录”并查看它们是否实际上是符号链接,如果是这样,您可能还需要使用参数调整 os.walk() 以跟随符号链接 - 请参阅 docs.python.org/3/library/os.html#os.walk 并可能读入 check-if-file-is-symlink-in-python跨度>
  • 感谢您的建议。如果我浏览到它们,我可以看到这些目录,并且这些目录不是符号链接,它们是由另一个进程创建的。使用 os.path.isdir 或 isfile 返回 True。我没有提到这是对象内部的方法。也许这与特殊性有关。
  • 原来 os.walk 或 os.listdir 命令在上一个异步命令之后被调用得太快了。 time.sleep() 导致返回正确的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2019-05-15
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2013-02-21
相关资源
最近更新 更多