寻求Excel、Python和XLRD的帮助
我刚开始学习编程,所以选择了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 个回答
看起来不错。不过有一点需要注意:你应该把“行”换成“单元格”,因为你实际上是在每一行中读取单元格里的值。
我不确定你是否打算使用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/
几点建议:
我建议你不要直接打印没有返回值的函数,直接调用它就可以,或者让它返回一些东西来打印。
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中是以随机顺序返回的。