web-dev-qa-db-fra.com

csv.writer écrit chaque caractère de Word dans une colonne / cellule distincte

Objectif: Extraire le texte de la balise d'ancrage à l'intérieur de toutes les lignes dans models et le mettre dans un csv.

J'essaie ce code:

with open('Sprint_data.csv', 'ab') as csvfile:
  spamwriter = csv.writer(csvfile)
  models = soup.find_all('li' , {"class" : "phoneListing"})

  for model in models:

      model_name = unicode(u' '.join(model.a.stripped_strings)).encode('utf8').strip()
      spamwriter.writerow(unicode(u' '.join(model.a.stripped_strings)).encode('utf8').strip())

Cela fonctionne bien, sauf que chaque cellule du csv ne contient qu'un seul caractère.

Comme ça:

|  S  |  A  |   M  |   S  |   U   |  N  |   G   |

Au lieu de:

|SAMSUNG|

Bien sûr, il me manque quelque chose. Mais quoi?

41
moaglee

writerow accepte une séquence. Vous lui donnez une seule chaîne, c'est donc le traiter comme une séquence, et les chaînes agissent comme des séquences de caractères.

Que voulez-vous d'autre dans cette rangée? Rien? Si oui, faites-en une liste d'un article:

spamwriter.writerow([u' '.join(model.a.stripped_strings).encode('utf8').strip()])

(Soit dit en passant, l'appel unicode() est complètement inutile puisque vous vous joignez déjà à un délimiteur unicode.)

14
Eevee

.writerow() requiert une séquence ('', (), []) et place chaque index dans sa propre colonne de la ligne, séquentiellement. Si votre chaîne souhaitée n'est pas un élément d'une séquence, writerow() itérera sur chaque lettre de votre chaîne et chacune sera écrite dans votre CSV dans une cellule distincte.

après vous import csv

Si c'est votre liste:

myList = ['Diamond', 'Sierra', 'Crystal', 'Bridget', 'Chastity', 'Jasmyn', 'Misty', 'Angel', 'Dakota', 'Asia', 'Texxxas', 'Desiree', 'Monique', 'Tatiana']


listFile = open('Strippers.csv', 'wb')
writer = csv.writer(listFile)
for item in myList:
    writer.writerow(item)

Le script ci-dessus produira le CSV suivant: strippers.csv

D,i,a,m,o,n,d
S,i,e,r,r,a
C,r,y,s,t,a,l
B,r,i,d,g,e,t
C,h,a,s,t,i,t,y
J,a,s,m,y,n
M,i,s,t,y
A,n,g,e,l
D,a,k,o,t,a
A,s,i,a
T,e,x,x,x,a,s
D,e,s,i,r,e,e
M,o,n,i,q,u,e
T,a,t,i,a,n,a

Si vous voulez que chaque nom se trouve dans sa propre cellule, la solution consiste simplement à placer votre chaîne (item) dans une séquence. Ici, j'utilise des crochets []. :

listFile2 = open('Strippers2.csv', 'wb')
writer2 = csv.writer(listFile2)
for item in myList:
    writer2.writerow([item])

Le script avec .writerow([item]) produit les résultats souhaités: Strippers2.csv

Diamond
Sierra
Crystal
Bridget
Chastity
Jasmyn
Misty
Angel
Dakota
Asia
Texxxas
Desiree
Monique
Tatiana
67
mdandr

Il suffit de l'entourer d'un signe de liste (c'est-à-dire [])

writer.writerow([str(one_column_value)])
3
Reihan_amn

C'est généralement la solution que j'utilise:

import csv
    with open("output.csv", 'w', newline= '') as output:
        wr = csv.writer(output, dialect='Excel')
        for element in list_of_things:
            wr.writerow([element])
        output.close()

Cela devrait vous fournir une sortie de tous vos éléments de liste dans une seule colonne plutôt qu'une seule ligne.

Les points clés ici sont d'itérer sur la liste et d'utiliser '[list]' pour éviter les problèmes de séquencement csvwriter.

J'espère que c'est utile!

1
Steve B