【问题标题】:User input only works for the last file extension in a folder用户输入仅适用于文件夹中的最后一个文件扩展名
【发布时间】:2021-11-24 22:03:51
【问题描述】:

我正在努力修复代码中的错误。变量 (fext) 仅适用于文件夹中的最后一个文件。因此,如果碰巧最后一个文件是“jpg”,那么我的代码将按计划继续。但是,如果偶然最后一个文件是“gpx”或“csv”,那么即使文件夹中有“jpg”文件,也会触发 Else 错误。

如果所有文件类型都在文件夹中,有人可以帮我改进我的代码吗?我对 Python 还是很陌生,一直坚持如何继续。

下面是我的代码:

import os, string
from os.path import isfile, join

file_path = input("Enter the folder link: ")
print("")
TF = False

path_it = (os.path.join(root, filename)
    for root, _, filenames in os.walk(file_path)
    for filename in filenames)
for path in path_it:
    fext = os.path.splitext(os.path.basename(path))[1]
    fname = os.path.splitext(os.path.basename(path))[0]

while True:
    file_type = input("Enter file extention (e.g. txt, wav, jpg, gpx, pdf): ")
    print(file_type)
    if file_type in fext:
        TF = True
        break
    else:
        print("\n*** There is no '" + file_type + "' file extension in this folder, please try again.\n") 

Other code...

谢谢

【问题讨论】:

  • 你能检查一下你的代码吗:它的格式不正确(对于 os.walk 的 for 循环)并且 path_it 使用了在…之后定义的文件名
  • 您的 for 循环在每次迭代时都会覆盖 fext 和 fname 变量,因此只有最后一个扩展类型会匹配。尝试列表理解
  • 请修正代码的缩进。
  • 感谢您的意见!格式已更正。

标签: python user-input file-extension os.path


【解决方案1】:

列表理解可能是您获得所需结果的最佳解决方案。这会将所有文件类型存储在列表中传递的目录中。

fext = [os.path.splitext(os.path.basename(path))[1] for path in path_it]
fname = [os.path.splitext(os.path.basename(path))[1] for path in path_it]

但是,您还需要确保输入文件类型与格式匹配。上面会给你(例如)['.csv', '.pdf', '.gpx'],所以你需要确保输入的格式是一样的,也就是说,不只是'csv'而是'.csv',否则会匹配不上。

while循环也可以改成while not TF,一旦TF改成True就会断循环,而不是用break.断循环

【讨论】:

    【解决方案2】:

    如果您要检查文件夹中包含的所有扩展名,fext 和 fname 变量应该返回一个可迭代对象。试试下面的列表推导。

    fext = [os.path.splitext(os.path.basename(path))[1] for path in path_it]
    fname = [os.path.splitext(os.path.basename(path))[1] for path in path_it]
    

    【讨论】:

      猜你喜欢
      • 2015-12-18
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2014-10-06
      相关资源
      最近更新 更多