Python écrit en CSV ligne par ligne

101

J'ai des données auxquelles on accède via une requête http et qui sont renvoyées par le serveur dans un format séparé par des virgules, j'ai le code suivant:

site= 'www.example.com'
hdr = {'User-Agent': 'Mozilla/5.0'}
req = urllib2.Request(site,headers=hdr)
page = urllib2.urlopen(req)
soup = BeautifulSoup(page)
soup = soup.get_text()
text=str(soup)

Le contenu du texte est le suivant:

april,2,5,7
may,3,5,8
june,4,7,3
july,5,6,9

Comment puis-je enregistrer ces données dans un fichier CSV. Je sais que je peux faire quelque chose du genre de ce qui suit pour itérer ligne par ligne:

import StringIO
s = StringIO.StringIO(text)
for line in s:

Mais je ne sais pas comment écrire correctement chaque ligne en CSV

EDIT ---> Merci pour les commentaires suggérés, la solution était plutôt simple et peut être vue ci-dessous.

Solution:

import StringIO
s = StringIO.StringIO(text)
with open('fileName.csv', 'w') as f:
    for line in s:
        f.write(line)
Tigre moutarde
la source
1
C'est déjà un CSV, il suffit d'écrire chaque ligne dans un fichier ...
icedwater
1
Je ne suis pas sûr que vous ayez même besoin de l' StringIOimportation, pour être honnête. De plus, la solution telle quelle ne sépare probablement pas les lignes, car elle f.write()n'ajoute pas automatiquement de nouvelles lignes.
icedwater
@icedwater Je comprends ce que vous dites, mais j'ai exécuté le code ci-dessus et il a pu stocker correctement les données dans un fichier csv.
Mustard Tiger

Réponses:

175

Manière générale:

##text=List of strings to be written to file
with open('csvfile.csv','wb') as file:
    for line in text:
        file.write(line)
        file.write('\n')

OU

Utilisation de l'enregistreur CSV:

import csv
with open(<path to output_csv>, "wb") as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        for line in data:
            writer.writerow(line)

OU

Manière la plus simple:

f = open('csvfile.csv','w')
f.write('hi there\n') #Give your csv text here.
## Python will convert \n to os.linesep
f.close()
Ani Menon
la source
16
pour python 3, remplacez-le parwith open(<path to output_csv>, "w", newline='') as csv_file:
Khaled Hamed
1
Informations manquantes sur cette ligne for line in data:. Veuillez corriger cela. Je vous remercie.
Francisco Maria Calisto
@gsamaras L'idée était d'aider la communauté, contrairement à vous éditez et commentez qui sont inutiles.
Ani Menon
comment ajouter une ligne, s'il y a déjà quelque chose dans le fichier csv, en utilisant la troisième solution?
Jürgen K.
3
@ JürgenK. Utilisez 'a'(mode ajout) à la place de 'w'(mode écriture).
Ani Menon
15

Vous pouvez simplement écrire dans le fichier comme vous le feriez pour n'importe quel fichier normal.

with open('csvfile.csv','wb') as file:
    for l in text:
        file.write(l)
        file.write('\n')

Si juste au cas où il s'agit d'une liste de listes, vous pouvez directement utiliser le csvmodule intégré

import csv

with open("csvfile.csv", "wb") as file:
    writer = csv.writer(file)
    writer.writerows(text)
Vishwa
la source
8

J'écrirais simplement chaque ligne dans un fichier, car il est déjà au format CSV:

write_file = "output.csv"
with open(write_file, "w") as output:
    for line in text:
        output.write(line + '\n')

Je ne me souviens pas comment écrire des lignes avec des sauts de ligne pour le moment, cependant: p

En outre, vous voudrez peut - être jeter un oeil à cette réponse au sujet write(), writelines()et '\n'.

Eau glacée
la source
4

Pour compléter les réponses précédentes, j'ai créé une classe rapide pour écrire dans des fichiers CSV. Cela facilite la gestion et la fermeture des fichiers ouverts et assure une cohérence et un code plus propre si vous devez gérer plusieurs fichiers.

class CSVWriter():

    filename = None
    fp = None
    writer = None

    def __init__(self, filename):
        self.filename = filename
        self.fp = open(self.filename, 'w', encoding='utf8')
        self.writer = csv.writer(self.fp, delimiter=';', quotechar='"', quoting=csv.QUOTE_ALL, lineterminator='\n')

    def close(self):
        self.fp.close()

    def write(self, elems):
        self.writer.writerow(elems)

    def size(self):
        return os.path.getsize(self.filename)

    def fname(self):
        return self.filename

Exemple d'utilisation:

mycsv = CSVWriter('/tmp/test.csv')
mycsv.write((12,'green','apples'))
mycsv.write((7,'yellow','bananas'))
mycsv.close()
print("Written %d bytes to %s" % (mycsv.size(), mycsv.fname()))

S'amuser

jrm
la source
1

Et ça:

with open("your_csv_file.csv", "w") as f:
    f.write("\n".join(text))

str.join () Renvoie une chaîne qui est la concaténation des chaînes dans itérable. Le séparateur entre les éléments est la chaîne fournissant cette méthode.

Vlad Bezden
la source