En utilisant python 3.4 et j'ai un problème avec une petite partie d'un programme plus grand sur lequel je travaille. Pour cette partie, je dois comparer la colonne A de deux feuilles Excel 'Bookings.xlsx' et 'Forced.xlsx'.

La colonne A contient les numéros de réservation dans les deux feuilles, bookings.xlsx contient les données dont j'ai besoin (dans la même ligne) pour chaque numéro de réservation dans forced.xlsx

Voici la partie avec laquelle j'ai des problèmes.

reloc_sheet = reloc_book.sheet_by_index(0)
forced_sheet = forced_book.sheet_by_index(0)
bookings_sheet = bookings_book.sheet_by_index(0)

forced_rentals = []
for force_row in range(4,forced_sheet.nrows): #row 0:3 are headers
        Fnum = forced_sheet.cell(force_row, 0)
        for book_row in range(1,bookings_sheet.nrows): #row 0 is a header
                Bnum = bookings_sheet.cell(book_row,0)
                if Fnum == Bnum:
                        booNum = str(bookings_sheet.cell(book_row,0))
                        renCODate = bookings_sheet.cell(book_row,2)
                        renCOLoc = str(bookings_sheet.cell(book_row,4))
                        renUnit = str(bookings_sheet.cell(book_row,13))
                        renAgent = str(bookings_sheet.cell(book_row,12))
                        forced_rentals += [[booNum,renCODate,renCOLoc,renUnit,renAgent]]

Donc, pour autant que je sache, cela devrait regarder le numéro de chaque réservation dans la feuille `` forcée '' (variable Fnum) et le comparer à la feuille `` réservations '' (variable Bnum) et quand il trouve une correspondance, il ajoutera les données appropriées de cette ligne à la liste 'forced_rentals'.

Le problème est qu'une fois cette boucle terminée, la liste est vide mais elle devrait avoir trouvé 632 correspondances et donc contenir 632 listes imbriquées. Je suis sûr que c'est une solution très simple mais je ne peux pas la comprendre.

0
user3514222 18 juil. 2015 à 11:13

2 réponses

Meilleure réponse

J'ai résolu mon problème. Tout d'abord, voici l'extrait de code qui fonctionne maintenant:

forced_rentals = []
for force_row in range(4,forced_sheet.nrows):
        Fnum = forced_sheet.cell_value(force_row, 0)
        Fnum_type = type(Fnum)
        if type(Fnum) is float:
                Fnum = str(Fnum)
                Fnum = Fnum.replace('.0','')
        if Fnum[-2:] == '/1':
                Fnum = Fnum.replace('/1','')
        for book_row in range(1,bookings_sheet.nrows):
                Bnum = bookings_sheet.cell_value(book_row,0)
                Bnum_type = type(Bnum)
                if type(Bnum) is float:
                        Bnum = str(Bnum)
                        Bnum = Bnum.replace('.0','') 
                if Bnum[-2:] == '/1':
                        Bnum = Bnum.replace('/1','')                
                if Fnum == Bnum:
                        booNum = str(bookings_sheet.cell_value(book_row,0))
                        renCODate = bookings_sheet.cell_value(book_row,2)
                        renCOLoc = str(bookings_sheet.cell_value(book_row,4))
                        renUnit = str(bookings_sheet.cell_value(book_row,13))
                        renAgent = str(bookings_sheet.cell_value(book_row,12))
                        forced_rentals += [[booNum,renCODate,renCOLoc,renUnit,renAgent]]
                        break

1) Une variable tout nombre Bnum ou Fnum serait soit une chaîne, par exemple '7123456', soit un float 7123456.0 qui n'était pas reconnu comme la même valeur. La conversion en chaîne de caractères ferait simplement que le flottant '7123456.0' ne soit plus le même. J'ai résolu ceci par:

if type(Fnum) is float:
                Fnum = str(Fnum)
                Fnum = Fnum.replace('.0','')

Cela convertit un flottant en chaîne et supprime le '.0'

2) Le prochain problème est survenu lorsque j'ai réalisé que tous les numéros de réservation (variables Bnum et Fnum) n'incluraient pas un / 1. La location 7123456 et la location 7123456/1 sont les mêmes mais notre serveur de rapports (qui génère les feuilles Excel) utilisera les deux de manière interchangeable, ce qui signifie que la feuille forcée peut avoir 7123456 et la feuille de réservation 7123456/1. Afin de compenser cela, j'ai ajouté ceci:

if Fnum[-2:] == '/1':
                Fnum = Fnum.replace('/1','')

Cela recherchera tout numéro de réservation se terminant par «/ 1» et le supprimera.

0
user3514222 22 juil. 2015 à 04:02

Changement de cell() en cell_value(),

Fnum = forced_sheet.cell_value(force_row, 0)
Bnum = bookings_sheet.cell_value(book_row,0)

Ou le cast des types de Fnum et Bnum en str les comparera en fonction de leurs chaînes de contenu.

if str(Fnum) == str(Bnum):

Notez que cell() renvoie un objet xlrd.sheet.Cell.

Et la classe Cell de xlrd n'a pas __eq__() et __ne()__ pour prendre en charge les opérateurs d'égalité. En savoir plus ici: https://docs.python.org/2/reference /datamodel.html#object.< ne

Vous pouvez consulter la source de xlrd ici, https: // github .com / python-excel / xlrd / blob / master / xlrd / sheet.py.

Depuis Le module xlrd:

cellule (rowx, colx) [#]

Objet de cellule dans la ligne et la colonne données.

valeur_cellule (rowx, colx) [#]

Valeur de la cellule dans la ligne et la colonne données.

Pour cette raison, les types de Fnum et Bnum sont xlrd.sheet.Cell, pas str.

>>> type(Fnum)
<class 'xlrd.sheet.Cell'>
>>>
>>> type(Bnum)
<class 'xlrd.sheet.Cell'>

Mais en utilisant cell_value(),

>>> type(Fnum)
<class 'str'>
>>>
>>> type(Bnum)
<class 'str'>

Ensuite, vous pouvez les comparer en fonction de leurs valeurs de chaîne.

0
raymelfrancisco 19 juil. 2015 à 05:08