0

编程相对较新,因此我选择使用 python 来学习。

目前,我正在尝试使用 XLRD 从 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()

我已经得到了变量,它一口气读取了所有变量,这就是我缺乏编程技能的地方。我知道我需要遍历这些并用它们做一些事情,但我有点迷失了什么是最佳实践。任何见解都会很棒。

再次感谢你

4

3 回答 3

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()

或查看docs您可以从 row_values 中获取切片:

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 中返回的字典值是任意排序的。

于 2011-04-14T17:47:28.470 回答
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/

于 2011-04-15T00:15:34.707 回答
0

似乎很好。一句话:你应该用“单元格”替换“行”,因为你实际上是从每一行的单元格中读取值

于 2011-04-14T17:29:16.973 回答