Python CSV'ye satır satır yaz


104

Http isteği aracılığıyla erişilen ve sunucu tarafından virgülle ayrılmış biçimde geri gönderilen verilerim var, aşağıdaki koda sahibim:

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)

Metnin içeriği aşağıdaki gibidir:

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

Bu verileri bir CSV dosyasına nasıl kaydedebilirim? Satır satır yinelemek için aşağıdaki satırlar boyunca bir şeyler yapabileceğimi biliyorum:

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

Ama şimdi her satırı CSV'ye nasıl düzgün bir şekilde yazacağımdan emin değilim

DÜZENLE ---> Önerildiği üzere geri bildiriminiz için teşekkürler, çözüm oldukça basitti ve aşağıda görülebilir.

Çözüm:

import StringIO
s = StringIO.StringIO(text)
with open('fileName.csv', 'w') as f:
    for line in s:
        f.write(line)

1
Zaten bir CSV, sadece her satırı bir dosyaya
yazmanız gerekiyor

1
StringIODürüst olmak gerekirse , ithalata ihtiyacın olduğundan bile emin değilim . Ayrıca, olduğu gibi çözüm, satır f.write()başlarını otomatik olarak eklemediği için muhtemelen satırları ayırmaz.
icedwater

@icedwater Ne dediğini anlıyorum, ancak yukarıdaki kodu çalıştırdım ve verileri düzgün bir şekilde bir csv dosyasına depolayabildim.
Hardal Kaplanı

Yanıtlar:


181

Genel yol:

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

VEYA

CSV yazıcısını kullanma:

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)

VEYA

En basit yol:

f = open('csvfile.csv','w')
f.write('hi there\n') #Give your csv text here.
## Python will convert \n to os.linesep
f.close()

17
python 3 için, şu şekilde değiştirinwith open(<path to output_csv>, "w", newline='') as csv_file:
Khaled Hamed

1
Bu satırda eksik bilgi for line in data:. Lütfen bunu düzeltin. Teşekkür ederim.
Francisco Maria Calisto

@gsamaras Fikir, gereksiz olan düzenleme ve yorumlarınızın aksine, topluluğa yardımcı olmaktı.
Ani Menon

csv dosyasında zaten bir şey varsa, üçüncü çözümü kullanarak bir satır nasıl eklenir?
Jürgen K.

4
@ JürgenK. (Yazma modu) 'a'yerine (ekleme modu) kullanın 'w'.
Ani Menon

15

Normal bir dosyayı yazacağınız gibi dosyaya da yazabilirsiniz.

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

Her ihtimale karşı, bu bir liste listesiyse, doğrudan yerleşik csvmodülü kullanabilirsiniz

import csv

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

8

Zaten bir CSV biçiminde olduğu için her satırı bir dosyaya yazarım:

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

Bununla birlikte, şu anda satır sonlu satırların nasıl yazılacağını hatırlayamıyorum: p

Ayrıca, bakmak isteyebilirsiniz bu cevabı hakkında write(), writelines()ve '\n'.


4

Önceki cevapları tamamlamak için, CSV dosyalarına yazmak için hızlı bir sınıf hazırladım. Birden çok dosyayla uğraşmanız gerekiyorsa, açık dosyaları yönetmeyi ve kapatmayı ve tutarlılık ve daha temiz kod elde etmeyi kolaylaştırır.

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

Örnek kullanım:

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

İyi eğlenceler


1

Peki buna ne dersin:

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

str.join () Dizelerin yinelenebilir olarak birleştirilmesi olan bir dize döndürür. Öğeler arasındaki ayırıcı, bu yöntemi sağlayan dizedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.