पुराने csv फ़ाइल अजगर के लिए नई पंक्ति जोड़ें


207

मैं अपनी पुरानी सीएसवी फ़ाइल में एक नई पंक्ति जोड़ने का प्रयास कर रहा हूं। मूल रूप से, यह हर बार अद्यतन होता है जब मैं पायथन स्क्रिप्ट चलाता हूं।

अभी मैं एक सूची में पुराने सीएसवी पंक्तियों मानों को संग्रहीत कर रहा हूं और फिर सीएसवी फ़ाइल को हटाकर नए सूची मूल्य के साथ फिर से बना रहा हूं।

जानना चाहते हैं कि क्या ऐसा करने के कोई बेहतर तरीके हैं।

जवाबों:


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

'a'पैरामीटर के साथ एक फ़ाइल खोलना आपको मौजूदा सामग्री को केवल ओवरराइट करने के बजाय फ़ाइल के अंत में संलग्न करने की अनुमति देता है। उसकी कोशिश करो।


2
मैंने fp = open (csv_filepathwithname, 'wa') लेखक = csv.writer (fp) somelist = [3,56,3,6,56] author.writerow ((somelist)) की कोशिश की, लेकिन केवल अंतिम पंक्ति में append प्राप्त किया। फ़ाइल।
लसपल

विधि मानती है कि संलग्न किए जा रहे आइटम अल्पविराम से अलग हो गए हैं, जो हमेशा ऐसा नहीं हो सकता है। तब लिखने का तरीका csv सीमांकक को बनाए नहीं रखेगा। नीचे दिए गए उत्तर उस अर्थ में अधिक मजबूत हैं।
sheth7

152

मैं csvमानक पुस्तकालय से मॉड्यूल का उपयोग करके इस समाधान को पसंद करता हूं और withफ़ाइल को खुला छोड़ने से बचने के लिए कथन।

'a'जब आप फ़ाइल खोलते हैं तो कुंजी बिंदु का उपयोग करने के लिए किया जाता है ।

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

यदि आप पायथन 2.7 का उपयोग कर रहे हैं, तो आप विंडोज में नई नई लाइनों का अनुभव कर सकते हैं। आप इस वसीयत के 'ab'बजाय उनका उपयोग करने से बचने की कोशिश कर सकते हैं 'a', हालांकि, आप टाइप करते हैं, टाइप करें: बाइट्स जैसी वस्तु की आवश्यकता होती है, पायथन में required स्ट्र ’नहीं और पाइथन 3.6 में CSVnewline=''जैसा कि नताचा ने सुझाव दिया है, जोड़ना आपको पायथन 2 और 3 के बीच एक पिछड़ी असंगति का कारण बनेगा ।


24

@GM के उत्तर के आधार पर और @ जॉन ला रोय की चेतावनी पर ध्यान देने के कारण, मैं फ़ाइल को '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'})

मैंने नियमित लेखक (डिक्ट के बिना) के साथ प्रयास नहीं किया, लेकिन मुझे लगता है कि यह ठीक भी होगा।


12

क्या आप फ़ाइल को 'w' के बजाय 'a' मोड से खोल रहे हैं?

अजगर डॉक्स में पठन और लेखन फाइलें देखें

7.2। पठन और लेखन फाइलें

खुला () फ़ाइल ऑब्जेक्ट लौटाता है, और आमतौर पर दो तर्कों के साथ उपयोग किया जाता है: खुला (फ़ाइल नाम, मोड)।

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

पहला तर्क एक स्ट्रिंग है जिसमें फ़ाइल नाम है। दूसरा तर्क एक और स्ट्रिंग है जिसमें कुछ वर्णों का वर्णन है जिसमें फ़ाइल का उपयोग किया जाएगा। मोड 'r' हो सकता है जब फ़ाइल केवल पढ़ने के लिए होगी, 'w' केवल लिखने के लिए (उसी नाम से एक मौजूदा फ़ाइल मिटा दी जाएगी), और 'a' फ़ाइल को जोड़ने के लिए खोलता है; फ़ाइल में लिखा गया कोई भी डेटा स्वचालित रूप से अंत में जोड़ा जाता है। 'r +' पढ़ने और लिखने दोनों के लिए फाइल खोलता है। मोड तर्क वैकल्पिक है; यदि इसे छोड़ दिया जाता है तो 'r' मान लिया जाएगा।

विंडोज पर, मोड में संलग्न 'बी' फ़ाइल को बाइनरी मोड में खोलता है, इसलिए 'आरबी', 'डब्ल्यूबी' और 'आर + बी' जैसे मोड भी हैं। विंडोज पर पायथन पाठ और बाइनरी फ़ाइलों के बीच अंतर करता है; जब डेटा पढ़ा या लिखा जाता है, तो टेक्स्ट फ़ाइलों में अंत-पंक्ति वर्ण स्वचालित रूप से थोड़े बदल जाते हैं। डेटा को फ़ाइल करने के लिए पर्दे के पीछे का यह संशोधन ASCII टेक्स्ट फ़ाइलों के लिए ठीक है, लेकिन यह JPEG या EXE फ़ाइलों की तरह ही द्विआधारी डेटा को भ्रष्ट कर देगा। ऐसी फ़ाइलों को पढ़ते और लिखते समय बाइनरी मोड का उपयोग करने के लिए बहुत सावधान रहें। यूनिक्स पर, यह मोड में एक 'बी' को जोड़ने के लिए चोट नहीं करता है, इसलिए आप इसे सभी बाइनरी फ़ाइलों के लिए प्लेटफ़ॉर्म-स्वतंत्र रूप से उपयोग कर सकते हैं।


हो सकता है कि आप अपने उत्तर को अधिक विस्तृत बना सकें, फिर यह एक वास्तविक उत्तर की तरह दिखेगा :-)
user702846

@user, मैंने एक लिंक जोड़ा - क्या यह आपकी मदद करता है?
जॉन ला रोय

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
कृपया अपना इंडेंटेशन ठीक करें। उत्तर भी एक स्पष्टीकरण से लाभान्वित होते हैं - और ये उत्तर भी अधिक उत्थान को आकर्षित करते हैं।
श्री टी

यह कुछ सरल कोड है, यह एपेंड मोड के लिए फ़ाइल खोलता है, एक हेडर रिक को लिखता है और फिर वीडियो रिकॉर्ड के माध्यम से काम करता है।
निशान उर्फमैन

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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.