web-dev-qa-db-fra.com

Lire CSV à l'aide de pandas avec des valeurs clôturées avec des guillemets doubles et des valeurs dans la colonne

J'ai besoin de lire un fichier dans python pandas du type suivant

"column1","column2","column3","column4"
"value1","value,1","value2","value3"
"value5","value6","value7","value8"
"value32","value21","value,31","value,44"

J'ai essayé d'utiliser

file1 = pd.read_csv('sample.txt',sep=',\s+',skipinitialspace=True,quoting=csv.QUOTE_ALL,engine=python)

il dit quelque chose comme Valueerro (attendu certaines lignes ont quelque chose d'autre) Pas exactement

J'ai besoin de lire un grand fichier CSV de ce type et de le charger sur DataFrame. Quels changements dois-je apporter pour le lire correctement?.

5
Ajay K S

Utilisez In python pandas sep=',\s*' à la place de sep=',\s+', il fera de l'espace optionnel après chaque virgule:

file1 = pd.read_csv('sample.txt',sep=',\s*',skipinitialspace=True,quoting=csv.QUOTE_ALL,engine='python')

Les virgules à l'intérieur des citations doubles sont OK, il est permis par la norme RFC4180.
En ce qui concerne " " Intérieur des valeurs de données (telles que "Valeur" "13") - Vous devrez nettoyer le fichier source avant de traiter. Si des devis doubles restent ensemble comme "", cela ne devrait pas être un problème car il est conforme à la norme CSV, il appelle des citations doubles échappées, mais s'il y a un espace entre deux guillemets, alors vous devez le nettoyer

Utilisation:

sed -r 's/\"\s+\"/\"\"/g' src.csv >cleared.csv 

avant de nourrir le CSV à Pandas. Il va enlever l'espace entre des citations ou une course

sed -r 's/\"\s+\"//g' src.csv >cleared.csv 

supprimer complètement les citations internes.

2
Alex

Pas besoin de préprogrammer le fichier CSV, utilisez simplement le type de moteur python:

dataset = pd.read_csv('sample.csv', sep=',', engine='python')
2
Deepak

Je "pense" ces deux commandes, avec des guillemets simples et des citations doubles entre le nom du fichier, devraient fonctionner de la même manière (ou non?):

pD.READAD_CSV ('FileName.csv')

ou ca

pd.read_csv ("FileName.csv")

0
Marco