【问题标题】:How to sequentially search for files and save them?如何按顺序搜索文件并保存?
【发布时间】:2016-06-06 12:42:11
【问题描述】:

我有下面的代码,它首先尝试查找 PDF 文件。如果它甚至没有成功找到一个 PDF 文件,那么它会继续搜索例如.TIF 文件在同一文件夹中。

但是,我有两个问题。首先,当它在文件夹中找到 PDF 文件时,它还会打印 .txt 文件中的所有 .TIF 文件。但是当它没有找到 PDF 文件时,它会停止(即使没有 break)并且不会生成 .txt 文件。我很困惑,不胜感激。

b = os.walk('C:\\Users\\USER\\Desktop\\FOLDER')
os.listdir('C:\\Users\\USER\\Desktop\\FOLDER')
f = []
for(dirpath, dirnames, filenames) in b:
    if f.extend(os.path.splitext(name)[0] for name in filenames if name.lower().endswith((".pdf"))) == []:
        pass
        break
    elif f.extend(os.path.splitext(name)[0] for name in filenames if name.lower().endswith((".tif"))) == []:
        pass


def save_to_file(text):
    for name in f:
        with open('C:\\Users\\USER\\Desktop\\FOLDER\\test.txt', mode='wt', encoding='utf-8') as myfile:
            myfile.write('\n'.join(text))
            myfile.write('\n')

save_to_file(f)

【问题讨论】:

  • f.extend 总是返回None,所以它在if 子句中没有任何业务。
  • 但如果我只使用 name.lower().endswith(..) 那么它也不起作用

标签: python file operating-system


【解决方案1】:

试试这个:

import os

def gather_files(folder, ending):
    contents = os.walk(folder)
    files = []
    for (dirpath, dirnames, filenames) in contents:
        files += ([file.splitext()[0] for file in filenames if file.lower().endswith(ending)])
    return files


def main():
    f = gather_files("test", ".pdf")
    if not f:
        f = gather_files("test", ".tif")

    if not f:
        print("No .pdf or .tif files found in the given directory.")
    else:
        with open("test_out.txt", "w", encoding="utf-8") as output:
            output.write("\n".join(f) + "\n")

if __name__ == "__main__":
    main()

这应该适合你。作为替代方案,您可以通过硬编码值(如文件夹和结尾)将主要部分移动到方法gather_files,或者您可以在方法中提供关键字“alternative_ending”或类似的东西。

也许再看看你的代码。你有一个方法 save_to_file(text),你用 f 调用它,并在其中迭代 f。可能是一个错字,你应该迭代文本,而不是 f。但是您根本不需要迭代,因为 text(或 f)包含文件名作为字符串列表。所以

with open("test_out.txt", "w", encoding="utf-8") as output:
    output.write("\n".join(text) + "\n")

会做你想做的一切。

【讨论】:

  • 感谢 Tobias,但我似乎无法生成带有输出的 .txt 文件?我真是个菜鸟..
  • 您遇到错误了吗?也许您对要写入的目录或类似的目录没有写入权限?请记住,如果文件夹中根本没有 .pdf/.tif 文件,则不会创建 .txt 文件,但脚本会打印一条消息。
  • 啊,没关系,它有效。但是,我现在得到了扩展名,如果你看一下我给出的代码,它是带有 splitext 的——所以它会生成一个没有扩展名的 txt 文件。但除此之外它工作得很好哇谢谢!!
  • 再次检查,我在最初发布后发现了我的错误并更正了它 - 我现在也在使用 splitext。不客气!
  • 哈哈我想我们同时解决了它,我确实想告诉你。但是非常感谢,这对我有很大帮助!给未来读者的旁注:我使用了这样的 splitext 并且它有效: for (dirpath, dirnames, filenames) in contents: files += ([os.path.splitext(file)[0] for file in filenames if file. lower().endswith(".tif")]) 返回文件
猜你喜欢
  • 2014-06-19
  • 2015-02-13
  • 2013-09-07
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多