70

Python で一連のファイルを utf-8 に変換する必要がありますが、「ファイルの変換」の部分で問題が発生しています。

私は同等のことをしたい:

iconv -t utf-8 $file > converted/$file # this is shell code

ありがとう!

4

9 に答える 9

56

次のようにcodecs モジュールを使用できます。

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)

EDITBLOCKSIZE :ファイルのチャンク サイズを制御するパラメータを追加しました。

于 2008-10-10T13:59:07.760 に答える
34

これは小さなテストでうまくいきました:

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

target.write(unicode(source.read(), sourceEncoding).encode(targetEncoding))
于 2008-10-10T14:07:07.820 に答える
14

返信ありがとうございます、それは動作します!

また、ソースファイルは混合形式であるため、順番に試すソース形式のリストを追加し(sourceFormats)、UnicodeDecodeError次の形式を試します。

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
# ...

(Rudro Badhonによる編集:これには、例外が発生しないまで元の試行複数の形式と、chardet.universaldetectorを使用する代替アプローチが組み込まれています)

于 2008-10-10T16:14:45.990 に答える
3

これは、任意のテキスト ファイルを UTF-8 エンコーディングのテキスト ファイルに変換するためのPython3関数です。(不要なパッケージを使用せずに)

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')

ループで簡単に使用して、ファイルのリストを変換できます。

于 2017-01-08T17:58:58.437 に答える
2

ソースのエンコーディングを推測するには、file*nix コマンドを使用できます。

例:

$ file --mime jumper.xml

jumper.xml: application/xml; charset=utf-8
于 2012-02-08T19:44:05.990 に答える
0

これが私の強引な方法です。また、入力内の \n と \r\n の混合も処理します。

    # open the CSV file
    inputfile = open(filelocation, 'rb')
    outputfile = open(outputfilelocation, 'w', encoding='utf-8')
    for line in inputfile:
        if line[-2:] == b'\r\n' or line[-2:] == b'\n\r':
            output = line[:-2].decode('utf-8', 'replace') + '\n'
        elif line[-1:] == b'\r' or line[-1:] == b'\n':
            output = line[:-1].decode('utf-8', 'replace') + '\n'
        else:
            output = line.decode('utf-8', 'replace') + '\n'
        outputfile.write(output)
    outputfile.close()
except BaseException as error:
    cfg.log(self.outf, "Error(18): opening CSV-file " + filelocation + " failed: " + str(error))
    self.loadedwitherrors = 1
    return ([])
try:
    # open the CSV-file of this source table
    csvreader = csv.reader(open(outputfilelocation, "rU"), delimiter=delimitervalue, quoting=quotevalue, dialect=csv.excel_tab)
except BaseException as error:
    cfg.log(self.outf, "Error(19): reading CSV-file " + filelocation + " failed: " + str(error))
于 2018-11-30T07:35:07.427 に答える