Python 在目录中搜索多个Excel文件类型
我正在尝试创建一个脚本,该脚本将在单个目录中搜索excel文件。脚本将在文件名中搜索子字符串,然后将包含该子字符串的文件名记录到新的excel文件中 我是Python新手,我的编程技能还不到标准,所以我在这里寻找一个起点 这里有一些代码,我已经找到并试图修改,但它似乎不适合我 以下是回溯: 回溯(最近一次呼叫最后一次): 文件“C:\Python27\lib\py\U compile.py”,第106行,在compile中打开(文件“U”)作为f: IOError:[Errno 22]无效的模式('U')或文件名:“” 编辑 下面是我在考虑了这些建议后得出的结论。它仍然不起作用,我也不知道为什么(因此被称为“supernoob”) 回溯(最近一次呼叫最后一次): 文件“C:\Python27\lib\py\u compile.py”,第106行,在compile中 打开(文件“U”)作为f: IOError:[Errno 22]无效的模式('U')或文件名:“”Python 在目录中搜索多个Excel文件类型,python,excel,python-2.7,Python,Excel,Python 2.7,我正在尝试创建一个脚本,该脚本将在单个目录中搜索excel文件。脚本将在文件名中搜索子字符串,然后将包含该子字符串的文件名记录到新的excel文件中 我是Python新手,我的编程技能还不到标准,所以我在这里寻找一个起点 这里有一些代码,我已经找到并试图修改,但它似乎不适合我 以下是回溯: 回溯(最近一次呼叫最后一次): 文件“C:\Python27\lib\py\U compile.py”,第106行,在compile中打开(文件“U”)作为f: IOError:[Errno 22]无效的模式
您当前的错误是IOError:[Errno 22]无效模式('U')或文件名 单个反斜杠是转义字符(用于编码特殊字符,如新行
\n
或制表符\t
)。当您希望python打印反斜杠时,我们需要使用双反斜杠。
C:\\Test
这应该可以解决此错误
其他可能的错误:
start\u dir
:start\u dir
不应使用os.getenv定义。当前,os.getenv
在os.environ字典中查找C:\Test
,该字典将诸如HOME
或Users
等环境变量的名称映射到它们的值(在本例中,是主目录或用户名)。您应该检查这是否返回了您期望的结果,但我怀疑不是。我只是将startdir的目录定义为一个字符串,startdir='C:\Test
我会将start\u dir
置于功能范围内。我的建议是执行def excelfiles(pattern,startdir='C:\Test'):
这样,在调用函数时可以选择提供不同的目录,但如果不这样做,函数将使用默认值C:\Test
os.walk()
返回的元组:os.walk
将返回一个包含三个值的元组:
找到的目录的名称、当前目录中的子目录列表以及当前目录中的文件列表。要解压缩包含3个值的元组,for循环中需要3个变量。os.walk(start\u dir)中root文件的当前for循环:
仅包含两个值。对于os.walk(start\u dir)中的root、subdir和文件,您需要将其更改为:
建议:
为了简化代码,我建议查看str.endswith的文档。str.endswith可以接受一个元组,如果str在元组中有一个后缀,则返回true。在您的情况下,filename.endswith(“.xls”)或filename.endswith(“.xlsx”)或filename.endswith(“.xlsx”):
可以简化为filename.endswith((“.xls”、“.xlsm”、“.xlsx”)
编辑:我为IOError提供了反斜杠解决方案。您当前的错误是IOError:[Errno 22]无效模式(“U”)或文件名 单个反斜杠是转义字符(用于编码特殊字符,如新行
\n
或制表符\t
)。当您希望python打印反斜杠时,我们需要使用双反斜杠。
C:\\Test
这应该可以解决此错误
其他可能的错误:
start\u dir
:start\u dir
不应使用os.getenv定义。当前,os.getenv
在os.environ字典中查找C:\Test
,该字典将诸如HOME
或Users
等环境变量的名称映射到它们的值(在本例中,是主目录或用户名)。您应该检查这是否返回了您期望的结果,但我怀疑不是。我只是将startdir的目录定义为一个字符串,startdir='C:\Test
我会将start\u dir
置于功能范围内。我的建议是执行def excelfiles(pattern,startdir='C:\Test'):
这样,在调用函数时可以选择提供不同的目录,但如果不这样做,函数将使用默认值C:\Test
os.walk()
返回的元组:os.walk
将返回一个包含三个值的元组:
找到的目录的名称、当前目录中的子目录列表以及当前目录中的文件列表。要解压缩包含3个值的元组,for循环中需要3个变量。os.walk(start\u dir)中root文件的当前for循环:
仅包含两个值。对于os.walk(start\u dir)中的root、subdir和文件,您需要将其更改为:
建议:
为了简化代码,我建议查看str.endswith的文档。str.endswith可以接受一个元组,如果str在元组中有一个后缀,则返回true。在您的情况下,filename.endswith(“.xls”)或filename.endswith(“.xlsx”)或filename.endswith(“.xlsx”):
可以简化为filename.endswith((“.xls”、“.xlsm”、“.xlsx”)
编辑:我为IOError提供了反斜杠解决方案。define“似乎不适合我”抱歉,它会引发多个错误。“缺少模块文档字符串”“从外部范围重新定义”“文件列表”“无效”
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
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