寻求Excel、Python和XLRD的帮助

1 投票
3 回答
15738 浏览
提问于 2025-04-16 15:45

我刚开始学习编程,所以选择了Python作为我的学习语言。

目前,我正在尝试从Excel表格中读取一系列用户名和密码,使用这些信息登录某个地方。然后退出,再去处理下一行,继续登录,依此类推。

这是我代码的一小部分:

import xlrd
wb = xlrd.open_workbook('test_spreadsheet.xls')

# Load XLRD Excel Reader

sheetname = wb.sheet_names() #Read for XCL Sheet names
sh1 = wb.sheet_by_index(0) #Login

def readRows():
        for rownum in range(sh1.nrows):
                rows = sh1.row_values(rownum)
                userNm = rows[4]
                Password = rows[5]
                supID = rows[6]
                print userNm, Password, supID

print readRows()

我已经把变量提取出来,并且一次性读取了所有内容,但这时候我的编程技能就显得不足了。我知道我需要逐个处理这些数据,但我有点不知道最佳的做法是什么。如果能给点建议就太好了。

再次感谢你们!

3 个回答

0

看起来不错。不过有一点需要注意:你应该把“行”换成“单元格”,因为你实际上是在每一行中读取单元格里的值。

1

我不确定你是否打算使用xlrd,不过你可以看看PyWorkbooks(顺便说一下,我是PyWorkbooks的作者 :D)

from PyWorkbooks.ExWorkbook import ExWorkbook

B = ExWorkbook()
B.change_sheet(0)
# Note:  it might be B[:1000, 3:6].  I can't remember if xlrd uses pythonic addressing (0 is first row)
data = B[:1000,4:7]  # gets a generator, the '1000' is arbitrarily large.

def readRows()
   while True:
       try:
           userNm, Password, supID = data.next()  # you could also do data[0]
           print userNm, Password, supID
           if usrNm == None: break  # when there is no more data it stops
       except IndexError:
           print 'list too long'
readRows()

你会发现这个工具比你之前用的任何方法都要快得多(希望也更简单)。你现在的方法是一次性获取整行数据,这一行可能有上千个元素。我写这个工具是为了尽可能快地获取数据(而且还支持像numpy这样的库)。

在你的情况下,速度可能不是那么重要。但将来,速度可能会变得重要 :D

可以去看看。这个程序附带了文档,适合新手用户使用。 http://sourceforge.net/projects/pyworkbooks/

5

几点建议:

我建议你不要直接打印没有返回值的函数,直接调用它就可以,或者让它返回一些东西来打印。

def readRows():
    for rownum in range(sh1.nrows):
        rows = sh1.row_values(rownum)
        userNm = rows[4]
        Password = rows[5]
        supID = rows[6]
        print userNm, Password, supID

readRows()

或者你可以查看这个文档,从行值中提取一部分:

row_values(rowx, start_colx=0, end_colx=None) [#]

Returns a slice of the values of the cells in the given row.

因为你只想要索引为4到6的行:

def readRows():
    # using list comprehension
    return [ sh1.row_values(idx, 4, 6) for idx in range(sh1.nrows) ]

print readRows()

使用第二种方法,你可以从函数中得到一个列表作为返回值,这样你就可以用这个函数把从Excel文件中读取的所有数据存到一个变量里。这个列表实际上是一个包含行值的列表的列表。

L1 = readRows()
for row in L1:
    print row[0], row[1], row[2]

在你获取到数据后,可以通过遍历这个列表来处理数据,就像上面打印的例子一样。

def login(name, password, id):
    # do stuff with name password and id passed into method
    ...

for row in L1:
    login(row)

你可能还想了解不同的数据结构来存储你的数据。如果你需要通过名字查找用户,使用字典可能是最好的选择:

def readRows():
    rows = [ sh1.row_values(idx, 4, 6) for idx in range(sh1.nrows) ]
    # using list comprehension
    return dict([ [row[4], (row[5], row[6])] for row in rows ])

D1 = readRows()
print D['Bob']
('sdfadfadf',23)

import pprint

pprint.pprint(D1)
{'Bob': ('sdafdfadf',23),
 'Cat': ('asdfa',24),
 'Dog': ('fadfasdf',24)}

需要注意的是,字典中的值在Python中是以随机顺序返回的。

撰写回答