2008-10-10 16 views

cevap

44

Böyle codecs module, kullanabilirsiniz:

import codecs 
BLOCKSIZE = 1048576 # or some other, desired size in bytes 
with codecs.open(sourceFileName, "r", "your-source-encoding") as sourceFile: 
    with codecs.open(targetFileName, "w", "utf-8") as targetFile: 
     while True: 
      contents = sourceFile.read(BLOCKSIZE) 
      if not contents: 
       break 
      targetFile.write(contents) 

DÜZENLEME: Dosya öbek boyutunu kontrol etmek BLOCKSIZE parametre eklendi.

+3

read() her zaman tüm dosyayı okuyacaktır - muhtemelen BLOCKSIZE'nin bir kerede okuma/yazma için uygun bir miktar olduğu .read (BLOCKSIZE) olmasını istersiniz. – Brian

+1

Bu doğru, teşekkürler. Örneğimi değiştireceğim. – DzinX

25

Bu küçük bir testte benim için çalıştı:

sourceEncoding = "iso-8859-1" 
targetEncoding = "utf-8" 
source = open("source") 
target = open("target", "w") 

target.write(unicode(source.read(), sourceEncoding).encode(targetEncoding)) 
+0

İkili mod belirtmek daha iyi olurdu. – Arafangion

+0

@Arafangion Neden ikili mod daha iyi olur? Teşekkürler! Honghe.Wu @ –

+0

: pencereler üzerinde metin modu varsayılan olduğunu ve satır sonları işletim sistemi tarafından bozulan olacağı anlamına gelir, disk üzerindeki kodlaması hakkında emin değilseniz istemediğiniz bir şey. – Arafangion

12

Teşekkür yanıtlar için, işe yarıyor!

Ve kaynak dosyaları karışık biçimli olduğundan, ben kaynak biçimlerinin listesini eklendi

dizisi ( sourceFormats) 'de yargılanması ve UnicodeDecodeError üzerine gelecek biçim deneyin: Rudro tarafından

from __future__ import with_statement 

import os 
import sys 
import codecs 
from chardet.universaldetector import UniversalDetector 

targetFormat = 'utf-8' 
outputDir = 'converted' 
detector = UniversalDetector() 

def get_encoding_type(current_file): 
    detector.reset() 
    for line in file(current_file): 
     detector.feed(line) 
     if detector.done: break 
    detector.close() 
    return detector.result['encoding'] 

def convertFileBestGuess(filename): 
    sourceFormats = ['ascii', 'iso-8859-1'] 
    for format in sourceFormats: 
    try: 
     with codecs.open(fileName, 'rU', format) as sourceFile: 
      writeConversion(sourceFile) 
      print('Done.') 
      return 
     except UnicodeDecodeError: 
     pass 

def convertFileWithDetection(fileName): 
    print("Converting '" + fileName + "'...") 
    format=get_encoding_type(fileName) 
    try: 
     with codecs.open(fileName, 'rU', format) as sourceFile: 
      writeConversion(sourceFile) 
      print('Done.') 
      return 
    except UnicodeDecodeError: 
     pass 

    print("Error: failed to convert '" + fileName + "'.") 


def writeConversion(file): 
    with codecs.open(outputDir + '/' + fileName, 'w', targetFormat) as targetFile: 
     for line in file: 
      targetFile.write(line) 

# Off topic: get the file list and call convertFile on each file 
# ... 

(EDIT Badhon: Bu bir istisna yanı sıra chardet.universaldetector kullanan alternatif bir yaklaşımı)

+0

Zorlu durumlar için feedharser.org adresinden kodlama modülü ile kodlamayı algılamayı deneyebilirsiniz, ancak sizin durumunuzda bu bir aşırı sıkışmadır. – itsadok

+0

Python 3.5 cihazım 'file' işlevini tanımıyor. Bu nereden geliyor? – physicalattraction

+0

Evet, bu cevap 8 yıl önce gönderildi, bu bir parça eski Python 2 kodu. –

0

Eğer file * nix komutunu kullanabilirsiniz kodlayan kaynak nerede olduğunu tahmin etmek alamadım kadar orijinal çoklu biçimlerini denemek içermektedir.

Örnek:

$ file --mime jumper.xml 

jumper.xml: application/xml; charset=utf-8 
+0

Bu soruya cevap vermiyor. –

0

Bu UTF-8 ile içine bir metin dosyası dönüştürmek için bir Python3 fonksiyonudur.

def correctSubtitleEncoding(filename, newFilename, encoding_from, encoding_to='UTF-8'): 
    with open(filename, 'r', encoding=encoding_from) as fr: 
     with open(newFilename, 'w', encoding=encoding_to) as fw: 
      for line in fr: 
       fw.write(line[:-1]+'\r\n') 

(gereksiz paketleri kullanmadan) Sen dosyaların listesini dönüştürmek için bir döngü içinde rahatlıkla kullanabilirsiniz.

İlgili konular