1
votes

Pourquoi mon code me donne-t-il une valeur unique plutôt qu'une liste

J'ai travaillé avec certains fichiers CSV, je suis un débutant mais je sens que je m'y attends, même si je ne peux pas comprendre pourquoi lorsque j'essaye d'imprimer la deuxième colonne de mon fichier csv, python imprime une seule valeur plutôt qu'une liste de toutes les valeurs de la deuxième colonne (elles seraient toutes 2018-01 puisque cette colonne est la même dans tout le tableau).

J'avais l'impression que mon code divisait les colonnes en listes individuelles par ligne donc si je voulais imprimer sep [1] , j'aurais obtenu la valeur de la 2ème colonne pour chaque ligne. Bien que actuellement sep [1] me donne une valeur unique.

Voici mon code

with open('2018-01-btp-street.csv', 'r') as file:
    for row in file:
        sep = row.split(',')


print (sep[1])!

Voici une image de le fichier csv https://i.stack.imgur.com/ijB1e.jpg


2 commentaires

à quoi sert ! ?


C'était une faute de frappe désolé


3 Réponses :


0
votes

Dans votre code, le fichier est un objet "semblable à un fichier". En l'itérant, vous obtenez des chaînes à chaque itération, donc ligne est une chaîne.

L'appel de row.split () renvoie une liste. Donc sep est une liste de chaînes. Donc sep [1] devrait bien être une chaîne.

Les bibliothèques Python comme csv et pandas ont des abstractions pour les colonnes et travaillent avec des colonnes, mais dans ce cas, vous n'allez pas avoir cela.

! à la fin de votre exemple de code ne me semble pas correct.


0 commentaires

1
votes

Vous réinitialisez sep chaque fois que vous bouclez sur une nouvelle ligne. Disons que le fichier a 2 lignes:

print(all_columns[1])

vous pouvez tester cela en ajoutant print (sep) juste après la définition de sep à l'intérieur la boucle.

Maintenant, ce que vous voulez, c'est la deuxième colonne de chaque ligne. string.split (other_string) renvoie une liste de tous des morceaux individuels d'une chaîne séparés par other_string . Vous pouvez donc stocker chacune de ces listes dans une nouvelle liste, comme ceci:

[[row1_col1, row2_col1, row3_col1], [row1_col2, row2_col2, row3_col2], ...]

maintenant, vous avez une liste de listes. Pour obtenir la deuxième valeur de toutes les listes, faites

with open('2018-01-btp-street.csv', 'r') as file:
     all_values = [row.split(',') for row in file]
all_columns = [[l[i] for l in all_values] for i in range(len(all_values[0]))] 

Vous pouvez également utiliser un list comprehension qui fait la même chose:

[[row1_col1, row1_col2, row1_col3, ...], [row2_col1, row2_col2, row2_col3,...], ...]

all_values ​​ ressemble à ceci:

with open('2018-01-btp-street.csv', 'r') as file:
     all_values = [row.split(',') for row in file]

Ou, pour obtenir des listes de toutes les colonnes à la place:

for l in all_values:
    print(l[1])

qui vous donnera une liste qui ressemble à

all_values = []
with open('2018-01-btp-street.csv', 'r') as file:
    for row in file:
        sep = row.split(',')
        all_values.append(sep)  # this is the important part. sep will still be reset every loop, but the values are now stored in all_values.

et maintenant vous pouvez utiliser

with open('2018-01-btp-street.csv', 'r') as file:
    for row in file:  # first loop: 
        sep = row.split(',')  # sep now contains all items in the first row that were separated by commas.
    #second loop: sep now only(!) contains all items in the SECOND row that were separated by commas.

pour obtenir toutes les valeurs de la deuxième colonne. p >


2 commentaires

Excellente réponse, donc juste pour m'assurer que j'ai bien compris cela, la raison pour laquelle print sep [1] uniquement les amis faisant partie de la liste plutôt que la liste de la liste à laquelle je m'attendais est que row.split fait une liste de toutes les chaînes utilisées dans mon fichier séparé par une virgule pour chaque élément individuel de la liste? Et parce que j'ai utilisé sep dans la boucle for, il finit par itérer, combinant ainsi chacune des valeurs de chaque ligne dans une seule liste?


En quelque sorte. Vous parcourez toutes les lignes du fichier. L'utilisation de split dans chaque boucle renvoie une liste de tous les éléments individuels de cette ligne, séparés à tous les endroits où il y avait une virgule. Vous définissez sep comme une copie de cette liste, mais vous la redéfinissez à nouveau pour chaque ligne, à chaque itération de la boucle for. Donc à la fin, sep est fondamentalement le même que last_row.split (',') , et seulement la dernière ligne. C'est donc une liste de chaînes, donc sep [1] n'est qu'une seule chaîne.



0
votes

Vous avez indiqué que vous souhaitiez "lister toutes les valeurs de la deuxième colonne". Dans ce cas, vous devez faire le print () à l'intérieur de la boucle ... vous devez donc indenter l'appel de fonction afin qu'il soit à l'intérieur de la boucle.

with open('2018-01-btp-street.csv', 'r') as file:
    for row in file:
        sep = row.split(',')
        print (sep[1])

Votre code initial parcourt la boucle puis exécute le print () de la dernière valeur une fois la boucle terminée.


0 commentaires