【问题标题】:Nested loops not getting desired output嵌套循环没有得到想要的输出
【发布时间】:2017-11-08 22:05:10
【问题描述】:

我正在尝试让这个嵌套循环为更大的程序工作。这只是我代码的一小部分

我希望我的程序将文件夹中的文件名与文本文档中的文件名匹配,如果它们匹配,则执行某些操作。我不知道为什么下面的嵌套循环不起作用。

allGood = open("allGood.txt", "r")
folder = "C:\your\folder\path\here"

for item in allGood:
    for file in os.listdir(folder):

        if file == item:
            print "in item loop" + item
            print "Do a thing"
    print "1 loop completed"

“allGood.txt”的内容

document10080.pdf
document10098.pdf
document10119.pdf
document10172.pdf
document10178.pdf
and so on

问题在于当它到达 IF 语句时。每个循环它应该只匹配一次,但事实并非如此。我只得到“1个循环完成”的巨大输出

插入print(file, item)的输出

('document10486.pdf', 'document10080.pdf\n')
('document10487.pdf', 'document10080.pdf\n')
('document10488.pdf', 'document10080.pdf\n')
('document10489.pdf', 'document10080.pdf\n')
('document1049.pdf', 'document10080.pdf\n')

我现在看到了我的问题

【问题讨论】:

  • 请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。
  • @Prune 所以你想让我添加一个“文件夹”对象吗?我还缺少什么?
  • 第二个文件夹是干什么用的?它没有在任何地方定义
  • @SPYBUG96:正如我所说,帖子应该是独立的。输入文件丢失并且 os.listdir 的返回将不符合您的需要。硬编码这些列表,你应该没问题。
  • @SPYBUG96 欢迎来到 homo sapiens 俱乐部,我通常称之为H. Sap. T 恤。

标签: python python-2.7 loops nested


【解决方案1】:

我没有足够的声誉来发表评论,所以我会尝试一个信息不足的答案。基本上你永远不会有比赛。这就是为什么你永远不会进入第二个循环。

您是否考虑将文件名作为集合处理?:

real_files = set(os.listdir(folder))
good_files = set(open("allGood.txt", "r").readlines())

matching_files = good_files.intersection(real_files)
for file in matching_files:
    pass # do something

文本文件条目也可能包含空格;考虑使用'strip`,例如:

import string
...
good_files = set(map(string.strip, open("allGood.txt", "r").readlines()))
...

或者稍微少一点“Perl-ish”;-)

...
good_files_raw = open("allGood.txt", "r").readlines()
good_files = set(map(string.strip, good_files_raw))
...

【讨论】:

  • 我正要提出这个策略——干得好。顺便说一句,缺乏声誉不是发表评论作为答案的借口。但是,这可以作为答案。
  • 是的,我度过了漫长的一天,我完全忘记了这一点,谢谢
【解决方案2】:

记住,allGood 是文件句柄,而不是文件内容。也许你需要的是这样的:

folder = os.listdir("C:\your\folder\path\here")

with open("allGood.txt", "r") as allGood:
    for line in allGood:
        line = line.strip()
        if line in folder:
        ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多