Python schreibt zeilenweise in CSV

100

Ich habe Daten, auf die über eine http-Anfrage zugegriffen wird und die vom Server in einem durch Kommas getrennten Format zurückgesendet werden. Ich habe den folgenden Code:

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)

Der Inhalt des Textes ist wie folgt:

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

Wie kann ich diese Daten in einer CSV-Datei speichern? Ich weiß, dass ich etwas in der folgenden Richtung tun kann, um Zeile für Zeile zu iterieren:

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

Aber ich bin mir nicht sicher, wie ich jetzt jede Zeile richtig in CSV schreiben soll

BEARBEITEN ---> Vielen Dank für das vorgeschlagene Feedback. Die Lösung war ziemlich einfach und ist unten zu sehen.

Lösung:

import StringIO
s = StringIO.StringIO(text)
with open('fileName.csv', 'w') as f:
    for line in s:
        f.write(line)
Senftiger
quelle
1
Es ist bereits eine CSV, Sie müssen nur jede Zeile in eine Datei schreiben ...
Eiswasser
1
Ich bin mir nicht sicher, ob Sie den StringIOImport überhaupt brauchen , um ehrlich zu sein. Außerdem trennt die Lösung wie sie ist wahrscheinlich nicht die Zeilen, da f.write()Zeilenumbrüche nicht automatisch angehängt werden.
Eiswasser
@icedwater Ich verstehe, was Sie sagen, aber ich habe den obigen Code ausgeführt und er konnte die Daten ordnungsgemäß in einer CSV-Datei speichern.
Senftiger

Antworten:

174

Allgemeiner Weg:

##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')

ODER

Verwenden des CSV-Writers:

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)

ODER

Einfachster Weg:

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
quelle
16
für Python 3 ändern Sie es inwith open(<path to output_csv>, "w", newline='') as csv_file:
Khaled Hamed
1
Fehlende Informationen in dieser Zeile for line in data:. Bitte beheben Sie das. Danke dir.
Francisco Maria Calisto
@gsamaras Die Idee war, der Community zu helfen, im Gegensatz zu Sie bearbeiten und kommentieren, die nutzlos sind.
Ani Menon
Wie füge ich mit der dritten Lösung eine Zeile hinzu, wenn sich bereits etwas in der CSV-Datei befindet?
Jürgen K.
3
@ JürgenK. Verwenden Sie 'a'(Anhänge-Modus) anstelle von 'w'(Schreibmodus).
Ani Menon
15

Sie können einfach in die Datei schreiben, wie Sie jede normale Datei schreiben würden.

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

Wenn es sich nur um eine Liste von Listen handelt, können Sie das integrierte csvModul direkt verwenden

import csv

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

Ich würde einfach jede Zeile in eine Datei schreiben, da sie bereits in einem CSV-Format vorliegt:

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

Ich kann mich im Moment nicht erinnern, wie man Zeilen mit Zeilenumbrüchen schreibt: p

Auch könnten Sie einen Blick auf, diese Antwort über write(), writelines()und '\n'.

Eiswasser
quelle
4

Um die vorherigen Antworten zu ergänzen, habe ich eine kurze Klasse zum Schreiben in CSV-Dateien erstellt. Es erleichtert das Verwalten und Schließen geöffneter Dateien sowie das Erreichen von Konsistenz und sauberem Code, wenn Sie mit mehreren Dateien arbeiten müssen.

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

Anwendungsbeispiel:

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()))

Habe Spaß

jrm
quelle
1

Was ist damit:

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

str.join () Gibt einen String zurück, der die Verkettung der Strings in iterable darstellt. Das Trennzeichen zwischen Elementen ist die Zeichenfolge, die diese Methode bereitstellt.

Vlad Bezden
quelle