পাইথনের সাথে একটি ইউটিএফ 8 সিএসভি ফাইল পড়া


94

আমি পাইথনের সাথে উচ্চারণযুক্ত অক্ষর (কেবল ফরাসি এবং / অথবা স্প্যানিশ অক্ষর) সহ একটি সিএসভি ফাইল পড়ার চেষ্টা করছি। সিএসভ্রেডারের জন্য পাইথন 2.5 ডকুমেন্টেশনের উপর ভিত্তি করে ( http://docs.python.org/library/csv.html ) এর সিএসভি ফাইলটি পড়তে আমি নীচের কোডটি নিয়ে এসেছি যেহেতু CSvreader কেবলমাত্র ASCII সমর্থন করে।

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
    # csv.py doesn't do Unicode; encode temporarily as UTF-8:
    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
                            dialect=dialect, **kwargs)
    for row in csv_reader:
        # decode UTF-8 back to Unicode, cell by cell:
        yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')

filename = 'output.csv'
reader = unicode_csv_reader(open(filename))
try:
    products = []
    for field1, field2, field3 in reader:
        ...

নীচে আমি যে সিএসভি ফাইলটি পড়ার চেষ্টা করছি তার একটি নির্যাস দেওয়া হয়েছে:

0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu
0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris
0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert
...

আমি ইউটিএফ -8 এ এনকোড / ডিকোড করার চেষ্টা করা সত্ত্বেও, আমি এখনও নিম্নলিখিত ব্যতিক্রম পাচ্ছি:

Traceback (most recent call last):
  File ".\Test.py", line 53, in <module>
    for field1, field2, field3 in reader:
  File ".\Test.py", line 40, in unicode_csv_reader
    for row in csv_reader:
  File ".\Test.py", line 46, in utf_8_encoder
    yield line.encode('utf-8', 'ignore')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 68: ordinal not in range(128)

আমি কিভাবে এটা ঠিক করব?


মার্টিন, আপনি যদি আশেপাশে থাকেন তবে আপনি কী কেবল মার্টেলির পাইথন 2 উত্তর থেকে গৃহীত উত্তরগুলি স্যুইচিংয়ের বিষয়ে বিবেচনা করবেন?
আন্তি হাপালা

উত্তর:


114

.encodeপদ্ধতি একটি বাইট স্ট্রিং করতে একটি ইউনিকোড স্ট্রিং প্রয়োগ পরার; তবে আপনি এটিকে পরিবর্তে বাইট স্ট্রিংয়ে ডাকছেন ... ভুল পথে 'রাউন্ড! ইউটিএফ -8 এনকোডযুক্ত পাঠ্য ফাইলগুলি পড়ার জন্য আরও সাধারণ সমাধানের জন্য codecsস্ট্যান্ডার্ড লাইব্রেরিতে এবং codecs.openবিশেষত মডিউলটি দেখুন । তবে, csvবিশেষত মডিউলটির জন্য আপনাকে utf-8 ডেটা পাস করতে হবে এবং আপনি ইতিমধ্যে যা পেয়ে যাচ্ছেন তাই আপনার কোডটি আরও সহজ হতে পারে:

import csv

def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
    csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
    for row in csv_reader:
        yield [unicode(cell, 'utf-8') for cell in row]

filename = 'da.csv'
reader = unicode_csv_reader(open(filename))
for field1, field2, field3 in reader:
  print field1, field2, field3 

পিএস: যদি দেখা যায় যে আপনার ইনপুট ডেটা utf-8 এ নয়, তবে উদাহরণস্বরূপ আইএসও -8859-1 তে রয়েছে, তবে আপনার "ট্রান্সকোডিং" প্রয়োজন (যদি আপনি csvমডিউল স্তরে utf-8 ব্যবহার করতে আগ্রহী হন ) , ফর্মটি line.decode('whateverweirdcodec').encode('utf-8')- তবে সম্ভবত আপনি yieldআমার কোডটিতে লাইনটিতে আপনার বিদ্যমান এনকোডিংয়ের নামটি পরিবর্তে এর পরিবর্তে ব্যবহার করতে পারেন 'utf-8', যেমন csvআইএসও -8859- * এনকোডেড বাইটস্ট্রিংগুলি দিয়ে ঠিক ঠিক চলতে চলেছে।


4
এটির অর্থ কি পাইথন ডক্সের উদাহরণ (যেখানে ওপি অনুলিপি এবং এখান থেকে আটকানো হয়েছে) ভুল? আপনি যখন ইউনিকোড সিএসভি দেওয়ার সময় এটি ভেঙে যায় তবে অতিরিক্ত এনকোডিং পদক্ষেপটি কী?
এ্যানেন্ট্রপিক


84

পাইথন 2.X

একটি ইউনিকোড-সিএসভি লাইব্রেরি রয়েছে যা আপনার সমস্যার সমাধান করা উচিত, এতে নতুন কোনও সিএসভি-সম্পর্কিত কোড না লিখার অতিরিক্ত সুবিধা রয়েছে।

এখানে তাদের রেডমি থেকে একটি উদাহরণ দেওয়া হয়েছে:

>>> import unicodecsv
>>> from cStringIO import StringIO
>>> f = StringIO()
>>> w = unicodecsv.writer(f, encoding='utf-8')
>>> w.writerow((u'é', u'ñ'))
>>> f.seek(0)
>>> r = unicodecsv.reader(f, encoding='utf-8')
>>> row = r.next()
>>> print row[0], row[1]
é ñ

পাইথন 3. এক্স

পাইথন 3 এ বিল্ট-ইন csvমডিউলটি বাক্সের বাইরে সমর্থিত । এই উদাহরণটি দেখুন:

import csv
with open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

10

আপনি যদি এনকোডিং utf-8 সহ কোনও সিএসভি ফাইলটি পড়তে চান তবে একটি নমনীয় পদ্ধতির যা আমি আপনাকে প্রস্তাব দিচ্ছি এটি হল এরকম কিছু ব্যবহার করা:

with open(file_name, encoding="utf8") as csv_file:

এই বিবৃতিটি দিয়ে আপনি পরে কোনও সিএসভি পাঠককে কাজ করতে পারেন।


4
এটি কি সম্ভব যে এটি কেবল পাইথন 3? এটা আমার জন্য ব্যর্থ হয়, পাইথন 2. স্বীকার না করে encodingopen
Zvika

@ জভিকা হ্যাঁ, অজগর 3 এ এই সমাধানটি কাজ করে:open('file.csv', 'r', encoding="ISO8859")
লুকা 76

আমি ওপেন (ফাইলের নাম, "আরটি", এনকোডিং = 'ইউটিএফ -8') যুক্ত করব, অর্থাত "রিড টেক্সট" মোডে ফাইল খুলুন
জিমি লি জোনস

3

এই পোস্টে উত্তরটিও চেকআউট করুন: https://stackoverflow.com/a/9347871/1338557

এটি ucsv.py নামক লাইব্রেরি ব্যবহারের পরামর্শ দেয়। পাইথন ২.7 এর এনকোডিং সমস্যা (utf-8) মোকাবেলার জন্য লিখিত CSV- এর সংক্ষিপ্ত এবং সাধারণ প্রতিস্থাপন। CSv.DictReader এর জন্য সমর্থনও সরবরাহ করে

সম্পাদনা করুন : আমি ব্যবহৃত নমুনা কোড যুক্ত করছি:

import ucsv as csv

#Read CSV file containing the right tags to produce
fileObj = open('awol_title_strings.csv', 'rb')
dictReader = csv.DictReader(fileObj, fieldnames = ['titles', 'tags'], delimiter = ',', quotechar = '"')
#Build a dictionary from the CSV file-> {<string>:<tags to produce>}
titleStringsDict = dict()
for row in dictReader:
    titleStringsDict.update({unicode(row['titles']):unicode(row['tags'])})

আপনার লিঙ্কটির কিছু বিবরণ আপনার উত্তরে রাখা উচিত, যদি লিঙ্কটি নষ্ট হয়ে যায় \
ইয়াজে

# ডাউনভোটার- আপনি কেন এটির কোনও কাজে লাগবেন না তা নিশ্চিত নন। Ucsv গ্রন্থাগারটি আমার পক্ষে ঠিক কাজ করেছিল। 2 দিন থেকে আমি যে ইউনিটবিহীন ত্রুটির সাথে লড়াই করেছিলাম তা সমাধান করতে সহায়তা করে। আপনি যদি কিছু নমুনা কোড খুঁজছিলেন, এখানে এটি সম্পাদনাতে চলে যায় @ ইয়াজে- আমি কিছু বিবরণ দিয়েছি; নমুনা কোড। এবং পাশাপাশি লিঙ্কটিও সংশোধন করা হয়েছে, এটি আগে অন্য কোনও পোস্টের দিকে ইশারা করছিল।
অত্রিপাভান

আপনি কোনও বাইনারি হিসাবে কোনও পাঠ্য ফাইল খোলার কোনও বিশেষ কারণ? 'rb' বাইনারি ফাইল খোলার জন্য।
Codeguy007

2

codecs.openঅ্যালেক্স মার্টেলির পরামর্শ হিসাবে ব্যবহার করা আমার পক্ষে কার্যকর বলে প্রমাণিত।

import codecs

delimiter = ';'
reader = codecs.open("your_filename.csv", 'r', encoding='utf-8')
for line in reader:
    row = line.split(delimiter)
    # do something with your row ...

4
এটি সমস্ত সিএসভি নিয়ে কাজ করবে না, নিম্নলিখিতটি একটি বৈধ সিএসভি সারি: "ফু বার; বাজ"; 231; 313; ";;;"; 1;
জেবি।

আপনি csvমডিউলটি আমদানি করেন তবে এটি ব্যবহার করবেন না।
ক্রিস্টোফ রাউসি

1

সাহায্য পৃষ্ঠার লিঙ্কটি অজগর ২.6 এর জন্য একই এবং যতদূর আমি জানি সিএসভি মডিউলে কোনও পরিবর্তন হয়নি 2.5 (বাগ ফিক্স ছাড়াও)। এখানে কোডটি কেবল কোনও এনকোডিং / ডিকোডিং ছাড়াই কাজ করে (ফাইল da.csv এ ভেরিয়েবল ডেটার সমান ডেটা থাকে )। আমি ধরে নিয়েছি যে কোনও ফাইল রূপান্তর ছাড়াই আপনার ফাইলটি সঠিকভাবে পড়া উচিত।

পরীক্ষা.পি:

## -*- coding: utf-8 -*-
#
# NOTE: this first line is important for the version b) read from a string(unicode) variable
#

import csv

data = \
"""0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu
0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris
0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert"""

# a) read from a file
print 'reading from a file:'
for (f1, f2, f3) in csv.reader(open('da.csv'), dialect=csv.excel):
    print (f1, f2, f3)

# b) read from a string(unicode) variable
print 'reading from a list of strings:'
reader = csv.reader(data.split('\n'), dialect=csv.excel)
for (f1, f2, f3) in reader:
    print (f1, f2, f3)

da.csv:

0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu
0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris
0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert

আমি ভাবছি পাইথনের কোন সংস্করণটি কাজ করবে? আমি 2.7 এবং 3.5 উভয়ই ত্রুটি পেয়েছি। "মান মূল্য: আনপ্যাক করার জন্য পর্যাপ্ত মান নেই (প্রত্যাশিত 3, 1 পেয়েছে)"
eis

@ আইস: আমি ধারণা করতে পারি যে আপনার সিস্টেমে কমাটি কোনও পূর্বনির্ধারিত সীমানা নয়। delimiter=','পরিবর্তে যোগ করার চেষ্টা করুন dialect=csv.excel
ভ্যান

1

লক্ষণীয় যে, যদি আপনার পক্ষে কোনও কিছুই কাজ না করে তবে আপনি হয়ত আপনার পথ থেকে বাঁচতে ভুলে গিয়েছেন।
উদাহরণস্বরূপ, এই কোড:

f = open("C:\Some\Path\To\file.csv")

একটি ত্রুটি হতে পারে:

সিনট্যাক্স এরর: (ইউনিকোড ত্রুটি) 'ইউনিকোডেস্কেপ' কোডেক বাইটগুলি ২-৩ অবস্থানে ডিকোড করতে পারে না: কেটে গেছে \ ইউএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স

ঠিক করার জন্য, কেবল করুন:

f = open("C:\\Some\\Path\\To\\file.csv")

0

Latin-1ইউনিকোড টেবিলটির দিকে তাকিয়ে আমি অক্ষর কোডটি দেখতে পেয়েছি 00E9" ল্যাটিন স্মার্ট লেটার ই উইথ অ্যাকুট "। এটি আপনার নমুনা ডেটার উচ্চারণযুক্ত চরিত্র। একটি সাধারণ পরীক্ষা Pythonদেখায় যে UTF-8এই চরিত্রটির জন্য এনকোডিং ইউনিকোড (প্রায় UTF-16) এনকোডিং থেকে আলাদা ।

>>> u'\u00e9'
u'\xe9'
>>> u'\u00e9'.encode('utf-8')
'\xc3\xa9'
>>> 

আমি আপনাকে encode("UTF-8")বিশেষ কল করার আগে ইউনিকোড ডেটা চেষ্টা করার পরামর্শ দিই unicode_csv_reader()। কেবল কোনও ফাইল থেকে ডেটা পড়লে এনকোডিংটি লুকিয়ে থাকতে পারে, তাই প্রকৃত অক্ষরের মানগুলি পরীক্ষা করুন।


0

অন্য সার্ভারে একই সমস্যা ছিল, তবে বুঝতে পেরেছিল যে লোকেলগুলি মেসড হয়েছে।

export LC_ALL="en_US.UTF-8"

সমস্যা সমাধান

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.