2013-06-04 4 views
5

J'utilise xlrd pour travailler sur des fichiers xls. Mon fichier xls a deux colonnes et mon exigence est de s'assurer que les deux colonnes ont un nombre égal de lignes. J'ai appris de help() que nous avons un row_len() pour rechercher la longueur d'une ligne donnée avec l'index, mais incapable d'en trouver pour col_len. Pouvez-vous s'il vous plaît aider avec toutPython: XLRD; comparer les colonnes longueur

Voici mon code

from xlrd import open_workbook 
spread_sheet=open_workbook("simple.xls") 
sheet1=spread_sheet.sheet_by_index(0) 

#validates the no of columns in the Spread sheet 
if sheet1.ncols == 2: 
    for sheet1_rows in range(sheet1.nrows): 
    for sheet1_cols in range(sheet1.ncols): 
     value=sheet1.cell(sheet1_rows,sheet1_cols).value 
     source=sheet1.cell(sheet1_rows,0).value 
     destination=sheet1.cell(sheet1_rows,1).value 
    #ignores the Source and Destination Headers 
    if value not in ('Source','Destination'): 
     print "Source is : %s \nDestination is : %s\n" % (source,destination) 
else: 
    print "XLS provided is not valid. Check the no of columns is 2" 

Quelques autres options en dehors de comparer les ci-dessous vous plaît

>>> print len(sheet1.col_values(0)) 
8 
>>> print len(sheet1.col_values(1)) 
8 

Merci pour votre réponse @alecxe. Au lieu d'ajouter quelques lignes supplémentaires à mon code, j'ai découvert quelque chose ci-dessous. S'il vous plaît conseiller cela fonctionnera sur

>>> print len(sheet1.col_values(0)) 
6 
>>> print len(sheet1.col_values(1)) 
6 
>>> sheet1.col_values(0) 
[u'A', 1.0, 1.0, 1.0, 1.0, 2.0] 
>>> sheet1.col_values(1) 
[u'B', 2.0, 2.0, 2.0, 2.0, ''] 
>>> print len(filter(None,sheet1.col_values(1))) 
5 
>>> 
+0

Quel est le problème avec 'len (sheet1.col_values ​​(0))'? –

+0

Merci pour votre réponse @MikeMuller. Depuis que je suis un débutant à Python, j'essaie d'apprendre tous les BIFs, ce qui économise l'effort. Juste curieux de savoir s'il existe en Python autre que 'len (sheet1.col_values ​​(0))'. – Sathy

+1

Qu'entendez-vous exactement par longueur de colonne? Il peut y avoir des cellules vides n'importe où. –

Répondre

4

Vous ne pouvez pas utiliser len(sheet.col_values(index)) pour mesurer combien de cellules sont définies dans la colonne (longueur de la colonne). col_values la longueur est toujours égale à sheet.nrows.

Imaginez que vous avez les éléments suivants dans le input.xls:

A B 
1 2 
1 2 
1 2 
1 2 
    2 

Ensuite len(sheet.col_values(0)) renverra 5 (ainsi que len(sheet.col_values(1))), ce qui est incorrect. Devrait être 4.

Au lieu de cela, il est préférable d'utiliser quelque chose comme ceci:

from itertools import takewhile 
import xlrd 


def column_len(sheet, index): 
    col_values = sheet.col_values(index) 
    col_len = len(col_values) 
    for _ in takewhile(lambda x: not x, reversed(col_values)): 
     col_len -= 1 
    return col_len 


book = xlrd.open_workbook("input.xls") 
sheet = book.sheet_by_index(0) 

print column_len(sheet, 0) # prints 4 
print column_len(sheet, 1) # prints 5 

espoir qui aide.

Questions connexes