【问题标题】:Python, can i get a return true or false, if a file TYPE exists or not?Python,如果文件类型存在与否,我可以返回真或假吗?
【发布时间】:2014-05-20 19:47:24
【问题描述】:

我已经阅读了此处的 path.exists() 和 path.isdir() 问题,但到目前为止我没有找到任何问题,请处理检查目录中是否存在特定文件类型......也许我没有为此搜索正确的术语。

基本上,我想轮询一组文件夹以查看那里是否有 txt 文件...如果它们在那里,我将要运行一串 pexpect 命令(每个命令都有不同的用户名/密码)来放置 * .txt 将它们保存到远程服务器位置。我的 put 和 pexpect 脚本已经在工作了。

我尝试使用这样的通配符,但当然没有这样的运气。

>>> print(os.path.exists("/mnt/path/to/shared/folder/*.txt"))
False

我不想运行 15 个 cron 作业,而是每 5 分钟执行一次盲放 *.txt,我只想运行一个检查所有文件夹位置的脚本。如果 txt 文件存在 = true(然后执行 pexpect 作业)如果为 false,则转到下一个文件夹路径并检查 txt 文件是否存在 = true(然后执行 pexpect 作业)等....

glob 似乎是门票。我用这个测试了它:

    import glob

if next(glob.iglob("/path/to/files/*.txt"), None):
   print "there are txt files" # there are text files
else:
    print "there are no text files"

$ python check.py

有txt文件

【问题讨论】:

  • if glob.glob 和 if next(glob.iglob),两者都很好用。

标签: python


【解决方案1】:

你想使用glob

import glob

if glob.glob("/mnt/path/to/shared/folder/*.txt"):
    # there are text files
else:
    # No text files

Glob 将返回与通配符可访问路径匹配的文件列表。如果没有文件,它将返回一个空列表。这真的只是os.listdirfnmatch.filter 在一起。

如果内存有问题,请按照 cmets 中 200OK 的建议使用 glob.iglob

import glob

if next(glob.iglob("/mnt/path/to/shared/folder/*.txt"), None):
    # there are text files
else:
    # No text files

iglob 构建一个迭代器而不是一个列表,这大大节省了内存。

【讨论】:

  • if next(glog.iglob(...), None)
  • 只是iglob 会......是的,@200OK 写的。除了它让我想到another answer,其中给出了为什么你不能只写if glob.iglob(..):的原因。 :-/
【解决方案2】:

如果您的问题具体是查找具有特定条件的文件,请考虑打开/读取程序find 的管道。

如:

find dir1 dir2 dir3 -name "*.txt"

该程序有几十个选项用于根据文件类型(符号链接等)进行过滤,并且应该为您提供很大的灵活性,这可能比使用各种 python 库自己编写更容易。

【讨论】:

  • 在尝试解析 find 命令的输出时存在严重问题,这使得它不太可能成为比简单地在 Python 中执行所有操作更好的选择。
  • 这些问题是什么?默认情况下,find 每行输出一个文件名
  • @chepner 我对 *nix 还是很陌生,但我无法想象解析二进制“是的,有文件”或“不,没有文件”会非常困难。
  • @chepner 这个答案有很多原因说明为什么尝试从 ls 的输出中解析文件属性是一个坏主意 - 但我说的是读取一个文件名find 中的每一行。我能看到的唯一问题是 OP 的文件名中是否包含 \n 。除了不太可能之外,使用 find 的功能似乎比尝试实现自己的过滤器代码来满足更高级的需求(即只返回比某个日期更新的符号链接)
猜你喜欢
  • 2013-06-14
  • 2016-03-15
  • 2019-03-10
  • 2017-04-01
  • 2014-12-03
  • 2014-09-07
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多