ฉันพยายามเพิ่มแถวใหม่ลงในไฟล์ csv เก่าของฉัน โดยทั่วไปจะได้รับการปรับปรุงทุกครั้งที่ฉันเรียกใช้สคริปต์ Python
ตอนนี้ฉันกำลังจัดเก็บค่า csv row เก่าในรายการแล้วลบไฟล์ csv และสร้างอีกครั้งด้วยค่ารายการใหม่
อยากรู้ว่ามีวิธีใดที่ดีกว่าในการทำเช่นนี้
ฉันพยายามเพิ่มแถวใหม่ลงในไฟล์ csv เก่าของฉัน โดยทั่วไปจะได้รับการปรับปรุงทุกครั้งที่ฉันเรียกใช้สคริปต์ Python
ตอนนี้ฉันกำลังจัดเก็บค่า csv row เก่าในรายการแล้วลบไฟล์ csv และสร้างอีกครั้งด้วยค่ารายการใหม่
อยากรู้ว่ามีวิธีใดที่ดีกว่าในการทำเช่นนี้
คำตอบ:
with open('document.csv','a') as fd:
fd.write(myCsvRow)
การเปิดไฟล์ด้วย'a'
พารามิเตอร์ช่วยให้คุณสามารถต่อท้ายไฟล์แทนการเขียนทับเนื้อหาที่มีอยู่ ลองดู
ฉันชอบโซลูชันนี้โดยใช้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
ตามคำตอบของ @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) แต่ฉันคิดว่ามันก็โอเคเช่นกัน
คุณกำลังเปิดไฟล์ด้วยโหมด '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' เข้ากับโหมดดังนั้นคุณจึงสามารถใช้เป็นแพลตฟอร์มได้อย่างอิสระสำหรับไฟล์ไบนารีทั้งหมด
หากไฟล์นั้นมีอยู่และมีข้อมูลอยู่เป็นไปได้ที่จะสร้าง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)
# 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)
ฉันใช้วิธีนี้เพื่อต่อท้ายบรรทัดใหม่ในไฟล์. 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")