Je traite un fichier csv et avant cela, j'obtiens le nombre de lignes en utilisant le code ci-dessous.

total_rows=sum(1 for row in open(csv_file,"r",encoding="utf-8"))

Le code a été écrit à l'aide de ce lien. Cependant, total_rows ne correspond pas au nombre réel de lignes dans le fichier csv. J'ai trouvé une alternative pour le faire mais j'aimerais savoir pourquoi cela ne fonctionne pas correctement ??

Dans le fichier CSV, il y a des cellules avec du texte énorme et je dois utiliser l'encodage pour éviter les erreurs de lecture du fichier csv.

Toute aide est appréciée!

0
Eswar 15 mars 2019 à 11:09

2 réponses

Meilleure réponse

Supposons que vous ayez un fichier csv dans lequel certaines cellules sont un texte sur plusieurs lignes.

$ cat example.csv
colA,colB
1,"Hi. This is Line 1.
And this is Line2"

Qui, à première vue, a trois lignes et wc -l est d'accord:

$ wc -l example.csv
3 example.csv

Et open aussi avec sum:

sum(1 for row in open('./example.csv',"r",encoding="utf-8"))
# 3

Mais maintenant, si vous lisez, c'est avec un analyseur csv tel que pandas.read_csv:

import pandas as pd

df = pd.read_csv('./example.csv')
df
   colA                                    colB
0     1  Hi. This is Line 1.\nAnd this is Line2

L'autre manière alternative de récupérer le nombre correct de lignes est donnée ci-dessous:

with open(csv_file,"r",encoding="utf-8") as f:
     reader = csv.reader(f,delimiter = ",")
     data = list(reader)
     row_count = len(data)

À l'exclusion de l'en-tête, le csv contient 1 ligne, ce qui, je crois, est ce que vous attendez. En effet, la première cellule de colB (alias énorme bloc de texte ) est désormais correctement gérée avec les guillemets enveloppant tout le texte.

2
Eswar 15 mars 2019 à 09:24

Je pense que le problème ici est que vous ne comptez pas les lignes, mais que vous comptez les nouvelles lignes (soit \ r \ n dans Windows ou \ n sous Linux). Le problème réside lorsque vous avez une cellule avec du texte où vous avez un exemple de caractère de nouvelle ligne:

1, "my huge text\n with many lines\n"
2, "other text"

Votre méthode pour les données ci-dessus renverra 4 quand il n'y a que 2 lignes

Essayez d'utiliser Pandas ou une autre bibliothèque pour lire les fichiers CSV. Exemple:

import pandas as pd
data = pd.read_csv(pathToCsv, sep=',', header=None);
number_of_rows = len(df.index) # or df[0].count()

Notez que len (df.index) et df [0] .count () ne sont pas interchangeables car count exclut les NaN.

1
wdudzik 15 mars 2019 à 08:27