Soru Python bir dosyadan okuma ve utf-8'e kaydetme


Bir dosyadan okuma, dizgisini işleme ve bir UTF-8 Dosyasına kaydetme konusunda sorun yaşıyorum.

İşte kod:

try:
    filehandle = open(filename,"r")
except:
    print("Could not open file " + filename)
    quit() 

text = filehandle.read()
filehandle.close()

Daha sonra değişken metin üzerinde işlem yapıyorum.

Ve sonra

try:
    writer = open(output,"w")
except:
    print("Could not open file " + output)
    quit() 

#data = text.decode("iso 8859-15")    
#writer.write(data.encode("UTF-8"))
writer.write(text)
writer.close()

Bu dosyaya mükemmel bir şekilde çıktı ama editörüme göre 8859-15'te bunu yapıyor. Aynı editör giriş dosyasını (değişken dosya adında) UTF-8 olarak tanıdığından, bunun neden olduğunu bilmiyorum. Yeniden araştırmamın gösterdiği gibi, yorumlanan çizgiler sorunu çözmelidir. Ancak bu satırları kullandığımda, sonuçta ortaya çıkan dosya özel karakter anlamında anlamsızdır, metin olarak tilde kelimesi ispanyolcadır. Stumped gibi herhangi bir yardım için gerçekten takdir ediyorum ....


44
2017-10-25 13:39


Menşei


Bu hangi editör? Hangi python sürümü? Buradan bu kod tamamen geçerli gibi görünüyor ve beklendiği gibi çalışmalı… - filmor
Kate editör. Python --version çıkışı Python 2.7.5+ - aarelovich
Kodunuzu 2.6.8, 2.7.5+ ve 3.3.2+ ile test ettim, her şey iyi çalışıyor. Örnek bir girdi verebilir misiniz? - zero323
Metin işlenmemiş baytta işlendiğinden, görünmeyen işlem kodu muhtemelen UTF8 kodlamasını karıştırdı. - Mark Tolonen
Tamam. Çözdüm. Çoğunlukla benim hatamdı herkese çok üzüldüm. İşte olan buydu. @MarkTolonen tarafından sağlanan kod, dosyayı açarken utf-8 yerine iso-8859-15 değiştirirsem çalıştı. Ancak editörüm dosyayı eski kodlamayı zaten yükleyen bellekten güncellediğinde bana anlamsızlık gösterdi. Dosyayı tekrar açtığımda bana iyi gösterdi. Hepinize teşekkür ederim ve rahatsız için özür dilerim !!! - aarelovich


Cevaplar:


Programınızın I / O sınırlarında Unicode'a ve içinden metinleri işleyin. codecs modülü:

import codecs
with codecs.open(filename,'r',encoding='utf8') as f:
    text = f.read()
# process Unicode text
with codecs.open(filename,'w',encoding='utf8') as f:
    f.write(text)

Düzenle:  io modül codec yerine tavsiye edilir ve Python 3 ile uyumludur open sözdizimi:

import io
with io.open(filename,'r',encoding='utf8') as f:
    text = f.read()
# process Unicode text
with io.open(filename,'w',encoding='utf8') as f:
    f.write(text)

123
2017-10-25 13:55



Bana tam olarak ne söylediğini yaptım. Diğer öneriyle aynı hata - aarelovich
İşe koyuldum. Sorun orijinal dosya iso-8859-15 idi - aarelovich
Buna gelen herkes için Python3 için lütfen unutmayın. open() ve io,open() aynıdır. Sadece kullan open(). Yardım'a bakın (açık) ve bunun io.open () ile aynı olduğunu göreceksiniz - başlıkta bile io modülünde açık olan yerleşik fonksiyonda Yardım yazıyor. - Shawn Mehan
@arturomp Ayrıca işe yaramaz. io.open Unicode dizeleri, bayt dizeleri değil, yazılmasını bekler. Bildirilen kodlamaya kodlama yapar. - Mark Tolonen
@arturomp Düzeltme, Python 3 üzerinde çalışmayacak. Python 2 varsayılan olarak bayt dizesini tekrar Unicode'a dönüştürecektir. ascii codec, bu yüzden dize sadece ASCII olduğu sürece çalışacaktır. İşte bu yüzden Python 3 değişti ... bu, "bazen işe yarayacak" diye önler. - Mark Tolonen


Bunu açık kullanarak yapamazsın. codec kullan.

Açık yerleşik işlevi kullanarak python'da bir dosya açarken, dosyayı her zaman ascii'de okuyacak / yazacaksınız. Bunu utf-8'de yazmak için şunu deneyin:

import codecs
file = codecs.open('data.txt','w','utf-8')

4
2017-10-25 13:52



Bunu denedim ve bir hata aldım: UnicodeDecodeError: 'utf8' codec konumu 57'de bayt 0xe9 kodunu çözemez: geçersiz devam bayt - aarelovich
Utf-8 kodlamasıyla tasarruf ediyor musunuz? Bak, ascii olan başka bir dosyadan okuyorsan, önce onu çözmelisin. - Fernando Freitas Alves
Kod gördüğünüz gibi. Yaptığım şey, writer = codecs.open (çıktı, 'w', 'utf-8') ile satır yazarı = open (output, 'w') olarak değiştirildi ve bu hata bana ulaştı - aarelovich
ama kod çözme ve kodlama neden yorumlanır? - Fernando Freitas Alves


Ayrıca aşağıdaki kodla da geçebilirsiniz:

file=open(completefilepath,'r',encoding='utf8',errors="ignore")
file.read()

4
2017-07-27 06:34