Python zapisuje do CSV linia po linii

102

Mam dane, do których dostęp uzyskuje się poprzez żądanie http i są odsyłane przez serwer w formacie oddzielonym przecinkami, mam następujący kod:

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)

Treść tekstu jest następująca:

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

Jak mogę zapisać te dane w pliku CSV. Wiem, że mogę zrobić coś w następujący sposób, aby iterować wiersz po wierszu:

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

Ale nie jestem pewien, jak teraz poprawnie zapisać każdy wiersz do CSV

EDYTUJ ---> Dzięki za opinię, zgodnie z sugestią, rozwiązanie było dość proste i można je zobaczyć poniżej.

Rozwiązanie:

import StringIO
s = StringIO.StringIO(text)
with open('fileName.csv', 'w') as f:
    for line in s:
        f.write(line)
Musztardowy Tygrys
źródło
1
To już plik CSV, wystarczy zapisać każdą linię do pliku ...
icedwater
1
Szczerze mówiąc, nie jestem pewien, czy potrzebujesz StringIOimportu. Ponadto rozwiązanie takie, jakie jest, prawdopodobnie nie oddziela linii, ponieważ f.write()nie dodaje automatycznie nowych linii.
icedwater
@icedwater Rozumiem, co mówisz, ale uruchomiłem powyższy kod i udało mi się poprawnie zapisać dane w pliku csv.
Mustard Tiger

Odpowiedzi:

176

Ogólny sposób:

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

LUB

Korzystanie z narzędzia do zapisywania 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)

LUB

Najprostszy sposób:

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
źródło
16
dla Pythona 3, zmień go nawith open(<path to output_csv>, "w", newline='') as csv_file:
Khaled Hamed
1
Brak informacji w tej linii for line in data:. Proszę to naprawić. Dziękuję Ci.
Francisco Maria Calisto
@gsamaras Pomysł polegał na pomocy społeczności, w przeciwieństwie do edytowania i komentowania, które są bezużyteczne.
Ani Menon
jak dodać linię, jeśli jest już coś w pliku csv, używając trzeciego rozwiązania?
Jürgen K.
3
@ JürgenK. Użyj 'a'(tryb dołączania) zamiast 'w'(tryb zapisu).
Ani Menon
15

Możesz po prostu pisać do pliku tak, jak zapisujesz każdy normalny plik.

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

Jeśli tak na wszelki wypadek jest to lista list, możesz bezpośrednio skorzystać z wbudowanego csvmodułu

import csv

with open("csvfile.csv", "wb") as file:
    writer = csv.writer(file)
    writer.writerows(text)
Vishwa
źródło
8

Po prostu zapisałbym każdą linię do pliku, ponieważ jest już w formacie CSV:

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

Nie pamiętam w tej chwili, jak pisać linie ze znakami końca linii: s

Ponadto, może chcesz przyjrzeć się tej odpowiedzi o write(), writelines()i '\n'.

schłodzona woda
źródło
4

Aby uzupełnić poprzednie odpowiedzi, przygotowałem szybką klasę pisania do plików CSV. Ułatwia zarządzanie i zamykanie otwartych plików oraz osiągnięcie spójności i czystszego kodu, jeśli masz do czynienia z wieloma plikami.

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

Przykładowe użycie:

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

baw się dobrze

jrm
źródło
1

A co z tym:

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

str.join () Zwraca łańcuch będący połączeniem ciągów w iterowalnych. Separatorem między elementami jest ciąg znaków zapewniający tę metodę.

Vlad Bezden
źródło