eski csv dosyasına python yeni satır ekle


212

Eski csv dosyama yeni bir satır eklemek çalışıyorum. Temel olarak, her Python betiğini çalıştırdığımda güncellenir.

Şu anda eski csv satır değerlerini bir listede saklıyorum ve sonra csv dosyasını silip yeni liste değeriyle yeniden oluşturuyorum.

Bunu yapmanın daha iyi yolları olduğunu bilmek istedim.

Yanıtlar:


252
with open('document.csv','a') as fd:
    fd.write(myCsvRow)

'a'Parametre ile bir dosyayı açmak, var olan içeriğin üzerine yazmak yerine dosyanın sonuna eklemenizi sağlar. Bunu dene.


2
Fp = open (csv_filepathwithname, 'wa') yazar = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)) yazdım, ancak yalnızca son satır dosya.
laspal

Yöntem, eklenen öğelerin virgülle ayrıldığını varsayar; bu her zaman geçerli olmayabilir. Daha sonra yazma yöntemi csv sınırlayıcısını korumaz. Aşağıdaki cevap bu anlamda daha sağlamdır.
sheth7

156

Dosyayı açık bırakmamak için csvstandart kitaplık modülünü ve withifadeyi kullanarak bu çözümü tercih ederim .

Önemli nokta, 'a'dosyayı açtığınızda eklemek için kullanılır .

import csv   
fields=['first','second','third']
with open(r'name', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

Python 2.7 kullanıyorsanız, Windows'ta gereksiz yeni satırlarla karşılaşabilirsiniz. Ancak, bu irade 'ab'yerine kullanarak bunları önlemek için deneyebilirsiniz 'a', TypeError neden : bayt benzeri bir nesne gereklidir, python 'str' ve Python 3.6 CSV . Ekleme newline='', Natacha anlaşılacağı gibi, size neden olacaktır Python 2 ile 3 arasında bir geriye uyumsuzluğu .


24

@ GM yanıtında ve @ John La Rooy'un uyarısına dikkat ederek, dosyayı 'a'modda açarak yeni bir satır ekleyebildim .

Windows'da bile, yeni satır sorunundan kaçınmak için, bunu bildirmeniz gerekir newline=''.

Artık dosyayı 'a'modda açabilirsiniz (b olmadan).

import csv

with open(r'names.csv', 'a', newline='') as csvfile:
    fieldnames = ['This','aNew']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writerow({'This':'is', 'aNew':'Row'})

Düzenli yazarla (Dict olmadan) denemedim, ama bence de iyi olacak.


12

Dosyayı 'w' yerine 'a' modunda mı açıyorsunuz?

Bkz . Python belgelerinde Dosya Okuma ve Yazma

7.2. Dosyaları Okuma ve Yazma

open () bir dosya nesnesi döndürür ve en çok iki argümanla kullanılır: open (dosya adı, mod).

>>> f = open('workfile', 'w')
>>> print f <open file 'workfile', mode 'w' at 80a0960>

İlk argüman dosya adını içeren bir dizedir. İkinci argüman, dosyanın nasıl kullanılacağını açıklayan birkaç karakter içeren başka bir dizedir. modu yalnızca dosya okunduğunda 'r' olabilir, yalnızca yazmak için 'w' (aynı ada sahip mevcut bir dosya silinir) ve 'a' dosyayı eklemek üzere açar; dosyaya yazılan tüm veriler otomatik olarak sona eklenir. 'r +' dosyayı hem okuma hem de yazma için açar. Mod argümanı isteğe bağlıdır; Eğer atlanırsa 'r' kabul edilecektir.

Windows'ta, moda eklenen 'b' dosyayı ikili modda açar, bu nedenle 'rb', 'wb' ve 'r + b' gibi modlar da vardır. Windows'da Python metin ve ikili dosyalar arasında bir ayrım yapar; metin dosyalarındaki satır sonu karakterleri, veriler okunduğunda veya yazıldığında otomatik olarak biraz değişir. Dosya verilerindeki bu perde arkasındaki değişiklik ASCII metin dosyaları için iyidir, ancak JPEG veya EXE dosyalarındaki böyle ikili verileri bozar. Bu tür dosyaları okurken ve yazarken ikili modu kullanmaya çok dikkat edin. Unix'te, moda bir 'b' eklemek zarar vermez, böylece tüm ikili dosyalar için platformdan bağımsız olarak kullanabilirsiniz.


belki cevabınızı daha ayrıntılı hale getirebilir, o zaman gerçek bir cevap gibi görünebilir :-)
user702846

@user, bir bağlantı ekledim - bu size yardımcı oluyor mu?
John La Rooy

7

Dosya varsa ve veri içeriyorsa, fieldnameparametreyi csv.DictWriterotomatik olarak oluşturmak mümkündür :

# read header automatically
with open(myFile, "r") as f:
    reader = csv.reader(f)
    for header in reader:
        break

# add row to CSV file
with open(myFile, "a", newline='') as f:
    writer = csv.DictWriter(f, fieldnames=header)
    writer.writerow(myDict)

6
# I like using the codecs opening in a with 
field_names = ['latitude', 'longitude', 'date', 'user', 'text']
with codecs.open(filename,"ab", encoding='utf-8') as logfile:
    logger = csv.DictWriter(logfile, fieldnames=field_names)
    logger.writeheader()

# some more code stuff 

    for video in aList:
        video_result = {}                                     
        video_result['date'] = video['snippet']['publishedAt']
        video_result['user'] = video['id']
        video_result['text'] = video['snippet']['description'].encode('utf8')
        logger.writerow(video_result) 

1
Lütfen girintinizi düzeltin. Cevaplar da bir açıklamadan yararlanır - ve bu cevaplar daha fazla oy kullanır.
Bay T

Bu basit bir kod, dosya ekleme modu için açılır, bir başlık rec yazar ve sonra aList video kayıtları üzerinde çalışır.
markkaufman

3

Bir .csv dosyasına yeni bir satır eklemek için şu yolu izleyin:

pose_x = 1 
pose_y = 2

with open('path-to-your-csv-file.csv', mode='a') as file_:
    file_.write("{},{}".format(pose_x, pose_y))
    file_.write("\n")
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.