ต่อท้ายแถวใหม่ไปยังไฟล์ csv เก่าหลาม


207

ฉันพยายามเพิ่มแถวใหม่ลงในไฟล์ csv เก่าของฉัน โดยทั่วไปจะได้รับการปรับปรุงทุกครั้งที่ฉันเรียกใช้สคริปต์ Python

ตอนนี้ฉันกำลังจัดเก็บค่า csv row เก่าในรายการแล้วลบไฟล์ csv และสร้างอีกครั้งด้วยค่ารายการใหม่

อยากรู้ว่ามีวิธีใดที่ดีกว่าในการทำเช่นนี้

คำตอบ:


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

การเปิดไฟล์ด้วย'a'พารามิเตอร์ช่วยให้คุณสามารถต่อท้ายไฟล์แทนการเขียนทับเนื้อหาที่มีอยู่ ลองดู


2
ฉันลอง fp = open (csv_filepathwithname, 'wa') writer = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)) แต่แถวสุดท้ายจะผนวกเข้ากับ ไฟล์.
laspal

วิธีการสันนิษฐานว่ารายการที่จะต่อท้ายจะถูกคั่นด้วยเครื่องหมายจุลภาคซึ่งอาจไม่ใช่กรณี จากนั้นวิธีการเขียนจะไม่รักษาตัวคั่น csv คำตอบด้านล่างมีความแข็งแกร่งกว่าในแง่นั้น
7

152

ฉันชอบโซลูชันนี้โดยใช้csvโมดูลจากไลบรารีมาตรฐานและwithคำสั่งเพื่อหลีกเลี่ยงการเปิดไฟล์

จุดสำคัญกำลังใช้'a'สำหรับต่อท้ายเมื่อคุณเปิดไฟล์

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

หากคุณใช้ Python 2.7 คุณอาจพบบรรทัดใหม่ที่ไม่จำเป็นใน Windows คุณสามารถพยายามหลีกเลี่ยงการใช้'ab'แทน'a'สิ่งนี้จะทำให้TypeError: ต้องใช้วัตถุคล้ายไบต์ไม่ใช่ 'str' ใน python และ CSVใน Python 3.6 เพิ่มnewline=''เป็น Natacha แนะนำจะทำให้คุณเข้ากันไม่ได้ย้อนหลังระหว่างงูหลามที่ 2 และ 3


24

ตามคำตอบของ @GM และใส่ใจกับคำเตือนของ @John La Rooy ฉันสามารถผนวกแถวใหม่ที่เปิดไฟล์ใน'a'โหมด

newline=''แม้จะอยู่ในหน้าต่างเพื่อหลีกเลี่ยงปัญหาการขึ้นบรรทัดใหม่คุณต้องประกาศเป็น

ตอนนี้คุณสามารถเปิดไฟล์ใน'a'โหมด (โดยไม่ต้อง b)

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

ฉันไม่ได้ลองกับนักเขียนธรรมดา (โดยไม่มี Dict) แต่ฉันคิดว่ามันก็โอเคเช่นกัน


12

คุณกำลังเปิดไฟล์ด้วยโหมด 'a' แทนที่จะเป็น 'w' หรือไม่?

ดูการอ่านและการเขียนไฟล์ในเอกสารหลาม

7.2 การอ่านและการเขียนไฟล์

open () ส่งคืนวัตถุไฟล์และมักใช้กับอาร์กิวเมนต์สองตัวคือ open (ชื่อไฟล์, โหมด)

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

อาร์กิวเมนต์แรกคือสตริงที่มีชื่อไฟล์ อาร์กิวเมนต์ที่สองคือสตริงอื่นที่มีอักขระสองสามตัวที่อธิบายวิธีการใช้ไฟล์ โหมดสามารถเป็น 'r' เมื่อไฟล์เท่านั้นที่จะอ่าน 'w' สำหรับการเขียนเท่านั้น (ไฟล์ที่มีอยู่ซึ่งมีชื่อเดียวกันจะถูกลบ) และ 'a' จะเปิดไฟล์สำหรับต่อท้าย ข้อมูลใด ๆ ที่ถูกเขียนไปยังไฟล์จะถูกเพิ่มไปยังจุดสิ้นสุดโดยอัตโนมัติ 'r +' เปิดไฟล์สำหรับการอ่านและการเขียน อาร์กิวเมนต์โหมดเป็นทางเลือก 'r' จะถูกสันนิษฐานหากถูกตัดออก

บน Windows 'b' ต่อท้ายโหมดจะเปิดไฟล์ในโหมดไบนารีดังนั้นจึงมีโหมดเช่น 'rb', 'wb' และ 'r + b' Python บน Windows สร้างความแตกต่างระหว่างข้อความและไฟล์ไบนารี อักขระสิ้นสุดบรรทัดในไฟล์ข้อความจะเปลี่ยนแปลงโดยอัตโนมัติเล็กน้อยเมื่อมีการอ่านหรือเขียนข้อมูล การปรับเปลี่ยนข้อมูลไฟล์หลังนี้เป็นเรื่องปกติสำหรับไฟล์ข้อความ ASCII แต่มันจะทำให้ข้อมูลไบนารีเสียหายเช่นนั้นในไฟล์ JPEG หรือ EXE ระมัดระวังในการใช้โหมดไบนารีเมื่ออ่านและเขียนไฟล์ดังกล่าว บน Unix ไม่ได้เป็นการยากที่จะผนวก 'b' เข้ากับโหมดดังนั้นคุณจึงสามารถใช้เป็นแพลตฟอร์มได้อย่างอิสระสำหรับไฟล์ไบนารีทั้งหมด


อาจเป็นได้ว่าคุณสามารถทำให้คำตอบของคุณละเอียดยิ่งขึ้นจากนั้นดูเหมือนคำตอบที่แท้จริง :-)
user702846

@user ฉันเพิ่มลิงก์ - นั่นช่วยคุณได้ไหม
John La Rooy

7

หากไฟล์นั้นมีอยู่และมีข้อมูลอยู่เป็นไปได้ที่จะสร้างfieldnameพารามิเตอร์csv.DictWriterโดยอัตโนมัติ:

# 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
โปรดแก้ไขการเยื้องของคุณ คำตอบยังได้ประโยชน์จากคำอธิบาย - และคำตอบเหล่านี้ยังดึงดูดผู้โหวตมากขึ้นอีกด้วย
นาย T

นี่เป็นรหัสง่ายๆที่จะเปิดไฟล์สำหรับโหมดต่อท้ายเขียนส่วนหัว rec แล้วทำงานผ่านบันทึกวิดีโอใน aList
markkaufman

2

ฉันใช้วิธีนี้เพื่อต่อท้ายบรรทัดใหม่ในไฟล์. csv:

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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.