在目录

时间:2015-12-02 21:56:46

标签: python excel python-2.7

我试图创建一个脚本来搜索单个目录中的excel文件。该脚本将在文件名中搜索子字符串,然后将包含该子字符串的文件的名称记录到新的excel文件中。

我是Python的新手,我的编程技巧仍然低于标准,所以我在这里寻找起点。

以下是我发现并尝试修改的一些代码,但它似乎对我无效。

这里是追溯:

  

追踪(最近一次呼叫最后一次):

     

文件" C:\ Python27 \ lib \ py_compile.py",第106行,在编译时使用open(文件,' U')作为f:

     

IOError:[Errno 22]无效模式(' U')或文件名:''

    import os, fnmatch

    start_dir = os.getenv('C:\Test')

    def excelfiles(pattern):
        file_list = []
        for root, files in os.walk(start_dir):
            for filename in files:
                if fnmatch.fnmatch(filename.lower(), pattern):
                    if filename.endswith(".xls") or filename.endswith(".xlsx") or filename.endswith(".xlsm"):
                        file_list.append(os.path.join(root, filename))
        return file_list

    file_list = excelfiles('*SP*')
    for i in file_list: 
        print i

修改 所以这是我在考虑建议之后想出来的。它仍然无法工作,我不确定为什么(因此" supernoob")。

    import os, fnmatch

    def excelfiles(pattern, start_dir = 'C:\Test'):
        file_list = []
        for root, subdir, files in os.walk(start_dir):
            for filename in files:
                if fnmatch.fnmatch(filename.lower(), pattern):
                    if filename.endswith(".xls", ".xlsx", ".xlsm"):
                        file_list.append(os.path.join(root, filename))
        return file_list

    file_list = excelfiles('*SP*')
    for i in file_list: 
        print i
  

追踪(最近一次呼叫最后一次):

     

文件" C:\ Python27 \ lib \ py_compile.py",第106行,在编译中       打开(文件,' U')为f:

     

IOError:[Errno 22]无效模式(' U')或文件名:''

1 个答案:

答案 0 :(得分:0)

您当前的错误是 IOError:[Errno 22]无效模式('U')或文件名

单个反斜杠是一个转义字符(用于编码特殊字符,如新行\n或制表符\t)。当你想让python打印反斜杠时,我们需要使用双反斜杠。 C:\\Test这应解决此错误。

其他可能的错误:

  1. 您如何定义start_dir
  2. 不应使用os.getenv定义

    start_dir。目前,os.getenv在os.environ字典中查找C:\Test,该字典将诸如HOMEUsers等环境变量等名称映射到其值(在此示例中为主页)目录或用户名)。您应该检查这是否返回了您的期望,但我怀疑它不是。我只想将startdir的目录定义为字符串startdir = 'C:\Test

    我会将start_dir带到函数的范围内。我的建议是def excelfiles(pattern, startdir = 'C:\Test'):这样你可以选择在调用函数时提供不同的目录,但如果你不这样做,函数将使用默认值C:\Test

    1. 解包由os.walk()返回的元组for for循环:
    2. 在循环的每次传递中,os.walk将返回一个包含三个值的元组: 它找到的目录的名称,当前目录中的子目录列表以及当前目录中的文件列表。要解压缩3个值的元组,您的for循环中需要3个变量。您当前的for循环for root, files in os.walk(start_dir):仅包含两个值。您需要将其更改为for root, subdir, files in os.walk(start_dir):

      建议:

      为了简化代码,我建议查看str.endswith的文档。 str.endswith可以接受一个元组,如果str具有元组中的一个足够,则返回true。在您的情况下,filename.endswith(".xls") or filename.endswith(".xlsx") or filename.endswith(".xlsm"):可以简化为filename.endswith((".xls", ".xlsm", ".xlsx"))

      编辑:我为IOError提供了反斜杠解决方案。