CSV फ़ाइल में UTF-8 कैसे लिखें


84

मैं एक PyQt4 से सीएसवी प्रारूप में एक पाठ फ़ाइल बनाने की कोशिश कर रहा हूं QTableWidget। मैं टेक्स्ट को UTF-8 एन्कोडिंग के साथ लिखना चाहता हूं क्योंकि इसमें विशेष वर्ण हैं। मैं निम्नलिखित कोड का उपयोग करता हूं:

import codecs
...
myfile = codecs.open(filename, 'w','utf-8')
...
f = result.table.item(i,c).text()
myfile.write(f+";")

यह तब तक काम करता है जब तक सेल में एक विशेष चरित्र नहीं होता है। मैंने भी कोशिश की

myfile = open(filename, 'w')
...
f = unicode(result.table.item(i,c).text(), "utf-8")

लेकिन यह भी बंद हो जाता है जब एक विशेष चरित्र दिखाई देता है। मुझे नहीं पता कि मैं क्या गलत कर रहा हूं।


"यह सबसे ऊपर है" इसका क्या मतलब है? आपको क्या त्रुटि मिल रही है? आपका इनपुट क्या है?

इनपुट एक pyqt4 QTableWidgetItem है। समस्या यह है कि मुझे कोई त्रुटि नहीं मिलती क्योंकि स्क्रिप्ट एक प्लगइन के रूप में चल रही है।
मार्टिन

फिर क्यूटी के बाहर समस्या को पुन: उत्पन्न करने का प्रयास करें।

समाधान मिल गया। मुझे लिखना थाmyfile.write(u"%s"&f+";")
मार्टिन

जवाबों:


106

अपने शेल रन से:

pip2 install unicodecsv

और (मूल प्रश्न के विपरीत) आप अजगर में निर्मित उपयोग कर रहे हैं यह मानते हुए csvमॉड्यूल, बारी
import csvमें
import unicodecsv as csvअपने कोड में।


29
यह सिर्फ आयात को प्रतिस्थापित करने से काम नहीं किया, मुझे लेखक बनाते समय एन्कोडिंग को भी जोड़ना पड़ा: writer = csv.writer(out, dialect='excel', encoding='utf-8')और फ़ाइल हैंडलर के साथ बनाएँ open(..., नहीं codecs.open(...
सुजाना

4
मैंने StackOverflow पर सभी सुझावों की कोशिश की और केवल यह मेरे लिए काम करता है।
चार्ल्स चाउ

95

यह पायथन 3.x ( डॉक्स ) के लिए बहुत सरल है ।

import csv

with open('output_file_name', 'w', newline='', encoding='utf-8') as csv_file:
    writer = csv.writer(csv_file, delimiter=';')
    writer.writerow('my_utf8_string')

पायथन 2.x के लिए, यहां देखें


1
क्या होगा अगर सामग्री writerowutf-8 नहीं है? क्या ये काम करेगा?
CKM

1
तीसरे पक्ष के पाइप स्थापित करने के लिए कोई ज़रूरत नहीं है।
वैभव विशाल


4

मेरे लिए UnicodeWriterपायथन 2 सीएसवी मॉड्यूल प्रलेखन से वर्ग वास्तव में काम नहीं करता था क्योंकि यह टूट जाता हैcsv.writer.write_row() इंटरफ़ेस को है।

उदाहरण के लिए:

csv_writer = csv.writer(csv_file)
row = ['The meaning', 42]
csv_writer.writerow(row)

काम करता है, जबकि:

csv_writer = UnicodeWriter(csv_file)
row = ['The meaning', 42]
csv_writer.writerow(row)

फेंक देंगे AttributeError: 'int' object has no attribute 'encode'

जैसा कि UnicodeWriterस्पष्ट रूप से सभी स्तंभ मूल्यों के तार होने की उम्मीद है, हम स्वयं मूल्यों को परिवर्तित कर सकते हैं और बस डिफ़ॉल्ट CSV मॉड्यूल का उपयोग कर सकते हैं:

def to_utf8(lst):
    return [unicode(elem).encode('utf-8') for elem in lst]

...
csv_writer.writerow(to_utf8(row))

या हम एक write_utf8_rowसमारोह जोड़ने के लिए बंदर-पैच csv_writer भी कर सकते हैं - व्यायाम पाठक पर छोड़ दिया जाता है।


हम में से उन लोगों के लिए py2.x के लिए बहुत सरल समाधान अभी भी इसका उपयोग करने के साथ अटक गया है।
खान

2

पायथन प्रलेखन में उदाहरण यूनिकोड CSV फ़ाइलों को लिखने का तरीका बताते हैं: http://docs.python.org/2/library/csv.html#examples

(यहां कोड कॉपी नहीं कर सकते क्योंकि यह कॉपीराइट द्वारा संरक्षित है)


1
लिंक के लिए धन्यवाद। यह मददगार था। मेरी जानकारी के लिए, भले ही आपने उस लिंक को पोस्ट किया हो जिसे आप यहां कोड पेस्ट नहीं कर सकते? (कॉपीराइट का मालिक होने के लिए +1)
म्यूटेंट

1
@ मुख्य: कोड वैज्ञानिक कागजात की तरह नहीं है। कोड कॉपीराइट द्वारा सुरक्षित है। जबकि मुझे 99.999% यकीन है कि पायथन के मालिक अपने कोड की नकल करने के लिए एसओ पर मुकदमा नहीं करेंगे, मुझे यह महसूस करने के लिए उनके लंबे लाइसेंस को पढ़ने की तरह महसूस नहीं हुआ कि इसकी अनुमति है या नहीं। इसके अलावा, लोगों को एक बार याद दिलाने के लिए अच्छा है कि "मैं इसे अपने मॉनिटर पर देख सकता हूं!"! "" मैं इसके साथ जो भी करना चाहता हूं वह कर सकता हूं ":-)
हारून डिगुल्ला

1
याद दिलाने के लिए शुक्रिया। दुर्भाग्यवश जिस दुनिया में हम रहते हैं, वह (अनुचित रूप से) तेज और लापरवाह हो जाती है, जहां जानकारी तेजी से प्रवाहित हो सकती है, एक कल्पना कर सकते हैं, यह एक बार और उस प्रतिबंध पर मायने रखता है जो मायने रखता है। इसके लिए धन्यवाद :)
म्यूटेंट

2
डॉक्स लिंक अर्ध-उपयोगी है (उदाहरण बेहतर हैं), लेकिन यहां "कॉपीराइट" तर्क अतिरेक और असिन है। अजगर स्पष्ट रूप से खुला स्रोत ( v2 v3) है ) है। लाइसेंस स्पष्ट है: "रॉयल्टी-फ्री, वर्ल्ड वाइड लाइसेंस को पुन: पेश, विश्लेषण, परीक्षण, प्रदर्शन और / या सार्वजनिक रूप से प्रदर्शित करने, व्युत्पन्न कार्य तैयार करने, वितरित करने के लिए ... [आदि, आदि]" यहां तक ​​कि सरल वाक्यांश। पृष्ठ के ऊपर, "GPL- संगत" आपको आराम देना चाहिए। ओपन सोर्स सामान साझा करें। यदि आप चाहें तो इसे संशोधित भी कर सकते हैं। यह एक कारण के लिए खुला स्रोत है।
एटलटाग

@alttag किसी प्रोजेक्ट में GPLd कोड को कॉपी करने या उपयोग करने का अर्थ है कि एक ही प्रोजेक्ट में अन्य सभी कोड अब GPL के अंतर्गत भी हैं। चूंकि मैं कॉपीराइट वकील नहीं हूं, मुझे नहीं पता कि वेब साइट पर प्रकाशित कोड के संबंध में इसका क्या मतलब है।
आरोन दिगुल्ला

0

के लिए को Python2 इससे पहले कि आप इस कोड का उपयोग कर सकते हैंcsv_writer.writerows(rows)
इस कोड को UTF-8 तार करने के लिए पूर्णांक परिवर्तित नहीं करेगा

def enc__rows_to_utf8 (पंक्तियाँ):
    एन्कोडेड_रो = []
    पंक्तियों में पंक्ति के लिए:
        एन्कोडेड_रो = []
        पंक्ति में मान के लिए:
            यदि प्रतिपूर्ति (मूल्य, आधारभूत):
                मान = यूनिकोड (मान) .encode ("utf-8")
            encoded_row.append (मान)
        encoded_rows.append (encoded_row)
    वापसी एन्कोडेड_रो

-1

एक बहुत ही सरल हैक सीएसवी के बजाय जोंस आयात का उपयोग करना है। Csv.writer के बजाय उदाहरण के लिए, बस निम्नलिखित करें:

    fd = codecs.open(tempfilename, 'wb', 'utf-8')  
    for c in whatever :
        fd.write( json.dumps(c) [1:-1] )   # json dumps writes ["a",..]
        fd.write('\n')
    fd.close()

मूल रूप से, सही क्रम में फ़ील्ड की सूची को देखते हुए, क्रमशः और आरंभ में एंड को छोड़कर json स्वरूपित स्ट्रिंग एक csv लाइन के समान है। और jthy अजगर 2 में utf-8 को मजबूत लगता है

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