在目录中search多个Excel文件types
我试图创build一个脚本,将search单个目录中的Excel文件。 该脚本将search文件名中的子string,然后将包含该子string的文件的名称logging到新的excel文件中。
我是Python的新手,我的编程技能仍然不够好,所以我正在寻找一个起点。
以下是我find并尝试修改的一些代码,但它似乎不适用于我。
这是回溯:
回溯(最近一次通话最后):
在文件“C:\ Python27 \ lib \ py_compile.py”中,第106行用open(file,'U')作为f:
IOError:[Errno 22] invalid mode('U')or filename:''
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
编辑所以这是我考虑了这些build议后想出来的。 它仍然不起作用,我不知道为什么(因此“超级”)。
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行用open(file,'U')作为f:
IOError:[Errno 22] invalid mode('U')or filename:''
您当前的错误是IOError:[Errno 22]无效模式('U')或文件名 。
一个反斜杠是一个转义字符(用于编码特殊字符,如新行\n
或制表符\t
)。 当你想Python打印反斜杠,我们需要使用双反斜杠。 C:\\Test
这应该解决这个错误。
其他可能的错误:
- 你如何定义
start_dir
:
start_dir
不应该使用os.getenv来定义。 目前, os.getenv
在os.environ字典中查找C:\Test
,它将诸如HOME
或Users
类的环境variables等名称映射到它们的值(本例中为主目录或用户名)。 你应该检查这是否回报你所期望的,但我怀疑它不是。 我只是将startdir的目录定义为一个string, startdir = 'C:\Test
。
我将在函数的范围内带入start_dir
。 我的build议是def excelfiles(pattern, startdir = 'C:\Test'):
这样你可以select在调用函数时提供不同的目录,但是如果你不这样做,函数将会使用默认值是C:\Test
。
- 解压
os.walk()
在for循环中返回的元组:
在循环的每一个循环中, os.walk
将返回一个三元组的元组:它find的目录的名称,当前目录中的子目录列表以及当前目录中的文件列表。 要解压3个值的元组,在for循环中需要3个variables。 你目前的for root, files in os.walk(start_dir):
for循环for root, files in os.walk(start_dir):
只能容纳两个值。 你需要把它改为for root, subdir, files in os.walk(start_dir):
一条build议:
为了简化你的代码,我build议看一下str.endswith的文档。 str.endswith可以接受一个元组,如果str在元组中有一个足够的元素,将返回true。 在你的情况下, filename.endswith(".xls") or filename.endswith(".xlsx") or filename.endswith(".xlsm"):
可以简化为filename.endswith((".xls", ".xlsm", ".xlsx"))
编辑:我提供了IOError的反斜杠解决scheme。