我试图创建一个脚本来搜索单个目录中的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')或文件名:''
答案 0 :(得分:0)
您当前的错误是 IOError:[Errno 22]无效模式('U')或文件名。
单个反斜杠是一个转义字符(用于编码特殊字符,如新行\n
或制表符\t
)。当你想让python打印反斜杠时,我们需要使用双反斜杠。
C:\\Test
这应解决此错误。
其他可能的错误:
start_dir
: start_dir
。目前,os.getenv
在os.environ字典中查找C:\Test
,该字典将诸如HOME
或Users
等环境变量等名称映射到其值(在此示例中为主页)目录或用户名)。您应该检查这是否返回了您的期望,但我怀疑它不是。我只想将startdir的目录定义为字符串startdir = 'C:\Test
。
我会将start_dir
带到函数的范围内。我的建议是def excelfiles(pattern, startdir = 'C:\Test'):
这样你可以选择在调用函数时提供不同的目录,但如果你不这样做,函数将使用默认值C:\Test
。
os.walk()
返回的元组for for循环:在循环的每次传递中,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提供了反斜杠解决方案。