为什么在python中使用xlrd打开工作簿时,变量可以工作,而不是列表?

为什么在python中使用xlrd打开工作簿时,变量可以工作,而不是列表?,python,xlsx,xlrd,Python,Xlsx,Xlrd,我对python非常陌生,因此非常感谢您的帮助。在过去的4天里,我一直在从我能想象到的各个角度攻击这个问题,希望我能自己解决它,但我被难住了 我正在尝试从一个扩展名为.xlsx的特定目录创建一个文件列表。然后,我想从列表中获取这些文件名并运行一些函数,将发现的文件名传递到函数中,并使用每个文件名对其进行迭代。我尝试了多种方法,但由于某些原因,我认为它不接受文件名 import os import xlrd mypath = "some path to files" fileslist = []

我对python非常陌生,因此非常感谢您的帮助。在过去的4天里,我一直在从我能想象到的各个角度攻击这个问题,希望我能自己解决它,但我被难住了

我正在尝试从一个扩展名为.xlsx的特定目录创建一个文件列表。然后,我想从列表中获取这些文件名并运行一些函数,将发现的文件名传递到函数中,并使用每个文件名对其进行迭代。我尝试了多种方法,但由于某些原因,我认为它不接受文件名

import os
import xlrd

mypath = "some path to files"
fileslist = []

def find_files():
    for file in os.listdir(mypath):
        if file.endswith(".xlsx")
            fileslist.append(file)

def other_function():    
    book = xlrd.open_workbook(fileslist)

我可以打印文件列表并显示它填充了正确的信息。我已经在脚本的主要部分以及其他的函数()区域中完成了这项工作。我还尝试在目录中使用有效的文件名命名变量filelist,比如说“file1.xlsx”,这样就可以了。一旦我把它输入到一个列表中,即使列表中唯一的条目是“file1.xlsx”,我也会得到以下错误

book = xlrd.open_workbook(fileslist)
  File "/Library/Python/2.7/site-packages/xlrd/__init__.py", line 110, in open_workbook
    filename = os.path.expanduser(filename)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 254, in expanduser
    if not path.startswith('~'):
AttributeError: 'list' object has no attribute 'startswith'

xlrd
正在查找要打开的文件路径。(文件)列表是1)不是文件路径,而是多个文件路径,2)不是字符串,这是您遇到的特定错误。字符串(是Python对象)有一个方法
.startswith
,该方法允许
xlrd
检查文件路径的第一部分(您应该给出
open\u工作簿
)是否为
~
。xlrd这样做可能是因为这会影响它查找文件的位置

xlrd.open\u工作簿
实际上是在试图双击您发送的文件路径,您(基本上)是在尝试同时单击列表中的所有文件,如果您可以使用X个不同的鼠标,每个鼠标都有一只手,这可能是可能的,但实际上不可能像通常构建计算机的方式那样

如果您想为您拥有的不同工作簿制作词典,但使用xlrd打开时,您可以使用以下方法:

xlrd_wbs = dict()
for my_file in filelist:
    xlrd_wbs[my_file] = xlrd.open_workbook(my_file)
然后通过以下方式访问不同的文件:

xlrd\u wbs[您使用的任何文件路径]

我会在这里使用字典,因为它允许您更可靠地访问所需的文件,但如果您只需要一个列表,您可以这样做:

xlrd_wbs = []
for my_file in filelist:
    xlrd_wbs.append(xlrd.open_workbook(my_file))

文件列表与文件不同。代码中缺少的是“用每个文件名迭代”部分。没有迭代。@melpomene为了尽可能地缩短文章,我没有输入代码的这一部分。我更感兴趣的是找出为什么会出现特定错误,因为我的脚本会在那里崩溃,因此不会发生迭代。出于好奇,这是否意味着如果文件的目录只有一个扩展名为.xlsx的文件,并且我使用str()强制脚本以字符串形式输出然后它将具有所需的.startswith方法?并不是说我打算使用这个解决方案,我只是想更清楚地理解这一点,以避免将来的错误。你可以尝试调用列表上的
str
,它不会给你一个合法的文件路径(
str(['a']))
产生
“['a']”
。你可以通过索引到列表中来访问单个文件,例如
my\u文件[0]
但以上示例基本上就是这么做的,不限制您使用
查找文件()
找到的第一个文件。谢谢。现在我明白了为什么我尝试的另一个方法只从函数返回了一个结果。我现在没有时间,但稍后有时间我将尝试您的解决方案。