পাইথনের সাথে একটি ইউটিএফ 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. স্বীকার না করে encodingএopen
— 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.