পাইথনে UTF-8 ফাইলে লিখুন


203

আমি সত্যিই সঙ্গে গুলিয়ে ফেলা করছি codecs.open function। যখন আমি করি:

file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()

এটি আমাকে ত্রুটি দেয়

ইউনিকোড ডিকোড এরর: 'এসকিআই' কোডেক বাইট 0x সিফ পজিশনে ডিকোড করতে পারে না 0: অরিনালাল রেঞ্জ নয় (128)

যদি আমি করি:

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()

এটা ভাল কাজ করে।

প্রশ্ন প্রথম পদ্ধতিটি কেন ব্যর্থ হয়? আমি কীভাবে বোমাটি sertোকাব?

দ্বিতীয় পদ্ধতিটি যদি এটি করার সঠিক উপায় হয় তবে এটি ব্যবহার করার codecs.open(filename, "w", "utf-8")কী উপায়?


54
ইউটিএফ -8 এ কোনও বিওএম ব্যবহার করবেন না। অনুগ্রহ.
tchrist

7
@ ক্রিশ্চ হাহ? কেন না?
সালমান ভন আব্বাস

8
ইউআরএফএফ -৮-এ স্যালম্যানপকে বিওএমের প্রয়োজন নেই এবং কেবল জটিলতা যুক্ত করুন (উদাহরণস্বরূপ আপনি কেবল বোম ফাইলগুলিকে কনটেনেট করতে পারবেন না এবং বৈধ পাঠ্য সহ ফলাফল পাবেন)। এই প্রশ্নোত্তর দেখুন ; কিউ
অ্যালাইস মাহডাল

উত্তর:


271

আমি বিশ্বাস করি যে সমস্যাটি codecs.BOM_UTF8বাইট স্ট্রিং, কোনও ইউনিকোড স্ট্রিং নয়। আমি সন্দেহ করি যে ফাইল হ্যান্ডলারটি "ইউটিএফ -8-এনকোডযুক্ত পাঠ্য হিসাবে ইউনিকোড লিখতে চাইছিলাম তার ভিত্তিতে আপনি কী বোঝাতে চেয়েছিলেন তা অনুমান করার চেষ্টা করছে, তবে আপনি আমাকে একটি বাইট স্ট্রিং দিয়েছেন!"

বাইট অর্ডার চিহ্নের জন্য ইউনিকোড স্ট্রিং (যেমন ইউনিকোড ইউ + এফএফএফ) সরাসরি লেখার চেষ্টা করুন, যাতে ফাইলটি কেবল ইউটিএফ -8 হিসাবে এনকোড করে:

import codecs

file = codecs.open("lol", "w", "utf-8")
file.write(u'\ufeff')
file.close()

(এটি সঠিক উত্তরটি বলে মনে হচ্ছে - বাইট EF বিবি বিএফ সহ একটি ফাইল))

সম্পাদনা: এস। লটের "utf-8-sig" এনকোডিং হিসাবে ব্যবহার করার পরামর্শটি নিজের নিজের স্পষ্ট করে বিওএম লেখার চেয়ে ভাল, তবে আমি এই উত্তরটি এখানে রেখে যাব যাতে এটি আগে কী ভুল হয়েছিল তা ব্যাখ্যা করে।


সতর্কতা: উন্মুক্ত এবং উন্মুক্ত এক নয়। আপনি যদি "কোডেকগুলি আমদানি ওপেন থেকে" করেন তবে এটি "খোলা" টাইপ করার মতো হবে না।
অ্যাপাচি

2
আপনি এর পরিবর্তে কোডেস.ওপেন ('test.txt', 'w', 'utf-8-sig') ব্যবহার করতে পারেন
বিটা-ক্লোজড

1
আমি "TypeError: একটি পূর্ণসংখ্যার প্রয়োজন (টাইপ str পেয়েছি)" পাচ্ছি। আমরা এখানে কি করছি বুঝতে পারছি না। কেউ দয়া করে সাহায্য করতে পারেন? আমার একটি পাঠ্য ফাইলে একটি স্ট্রিং (অনুচ্ছেদ) যুক্ত করতে হবে। লেখার আগে আমাকে কি আগে পূর্ণসংখ্যায় রূপান্তর করতে হবে?
মুগেন

@ মুগেন: আমি যে সঠিক কোডটি লিখেছি তা যতদূর দেখা যায় ঠিক কাজ করে works আমি আপনাকে কোন কোডটি পেয়েছি ঠিক কী কোড পেয়েছে এবং কোথায় ত্রুটি দেখা দিয়েছে তা জিজ্ঞাসা করার পরামর্শ দিচ্ছি ।
জন স্কিটি

@ মুগেন আপনাকে codecs.openকেবলopen
উত্তরবেন

178

নিম্নলিখিতটি পড়ুন: http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig

এটা কর

with codecs.open("test_output", "w", "utf-8-sig") as temp:
    temp.write("hi mom\n")
    temp.write(u"This has ♭")

ফলস্বরূপ ফাইলটি প্রত্যাশিত বিওএম সহ ইউটিএফ -8।


2
ধন্যবাদ। এটি কাজ করেছে (উইন্ডোজ 7 x64, পাইথন 2.7.5 x64)। আপনি যখন "এ" (অ্যাপেন্ড) মোডে ফাইলটি খুলবেন তখন এই সমাধানটি ভাল কাজ করে।
মোহামাদ ফকিহ

উইন্ডোজটিতে পাইথন 3 এটি আমার পক্ষে কাজ করেনি। এর পরিবর্তে আমাকে বোম্বফাইলে (ফাইল_নাম, 'ডাব্লুবি') দিয়ে এটি করতে হয়েছিল: বোম্বফিল.উরাইট (কোডেকস.বিওএম_উইফএফ) তারপর অ্যাপেন্ডের জন্য ফাইলটি পুনরায় খুলুন।
ডাস্টিন অ্যান্ড্রুজ

যোগ হতে পারে temp.close()?
user2905353

2
@ ব্যবহারকারী2905353: প্রয়োজন নেই; এই দ্বারা পরিচালিত হয় প্রেক্ষাপটে ব্যবস্থাপনা এর open
ম্যাথবুর্গ

11

@ এস-লট সঠিক পদ্ধতিটি প্রদান করে তবে ইউনিকোড সংক্রান্ত বিষয়ে প্রসারণের সাথে পাইথন ইন্টারপ্রেটার আরও অন্তর্দৃষ্টি দিতে পারে।

codecsমডিউল সম্পর্কে জন স্কিটি সঠিক (অস্বাভাবিক) - এতে বাইট স্ট্রিং রয়েছে:

>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>> 

অন্য নিট বাছাই করা, BOMএর একটি মানক ইউনিকোড নাম রয়েছে এবং এটি প্রবেশ করানো যেতে পারে:

>>> bom= u"\N{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'

এটি এর মাধ্যমেও অ্যাক্সেসযোগ্য unicodedata:

>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>> 

8

আমি একটি অজানা অক্ষর ফাইলটি একটি utf-8 ফাইলে রূপান্তর করতে * nix ফাইলটি ব্যবহার করি

# -*- encoding: utf-8 -*-

# converting a unknown formatting file in utf-8

import codecs
import commands

file_location = "jumper.sub"
file_encoding = commands.getoutput('file -b --mime-encoding %s' % file_location)

file_stream = codecs.open(file_location, 'r', file_encoding)
file_output = codecs.open(file_location+"b", 'w', 'utf-8')

for l in file_stream:
    file_output.write(l)

file_stream.close()
file_output.close()

1
এর # coding: utf8পরিবর্তে ব্যবহার করুন # -*- coding: utf-8 -*-মনে রাখা আরও সহজ।
show0k
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.