3

これは、テキスト ファイル内の特殊文字を置き換えて 1 つのファイルに連結するために使用しているコードです。

# -*- coding: utf-8 -*-

    import os
    import codecs

    dirpath = "C:\\Users\\user\\path\\to\\textfiles"
    filenames = os.listdir(dirpath)

    with codecs.open(r'C:\Users\user\path\to\output.txt', 'w', encoding='utf8') as outfile:
        for fname in filenames:
            currentfile = dirpath+"\\"+fname
            with codecs.open(currentfile, encoding='utf8') as infile:
        #print currentfile
                outfile.write(fname)
                outfile.write('\n')
                outfile.write('\n')

                for line in infile:

                    line = line.replace(u"´ı", "i")
                    line = line.replace(u"ï¬", "fi")
                    line = line.replace(u"fl", "fl")
                    outfile.write (line)

最初line.replaceのものは正常に機能しますが、他のものは機能しませんが (これは理にかなっています)、エラーが生成されなかったため、「可視性」の問題がある可能性があります (それが用語である場合)。そして、私はこれを作成しました:

import codecs

currentfile = 'textfile.txt'
with codecs.open('C:\\Users\\user\\path\\to\\output2.txt', 'w', encoding='utf-8') as outfile:
with open(currentfile) as infile:
for line in infile:
if "ï¬" not in line: print "not found!"

これは常に「見つかりません!」を返します。それらの文字が読み取られていないことを証明します。

with codecs.open('C:\Users\user\path\to\output.txt', 'w', encoding='utf-8') as outfile:最初のスクリプトでに変更すると、次のエラーが発生します。

Traceback (most recent call last):
File C:\\path\\to\\concat.py, line 30, in <module>
outfile.write(line)
File C:\\Python27\\codecs.py, line 691, in write
return self.writer.write(data)
File C:\\Python27\\codecs.py, line 351, in write
data, consumed = self.encode(object, self.errors)
Unicode DecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal
not in range (128)

私はPythonの経験があまりないので、すでに利用可能なさまざまなソースによって、それを理解することはできません:Pythonのドキュメント(12)およびStackOverflowの関連する質問(12

私はここで立ち往生しています。助言がありますか??すべての答えは大歓迎です!

4

1 に答える 1

0

codecs.open()エンコーディングを使用しない場合、使用しても意味がありません。読み取りと書き込みの両方に指定されたエンコーディングで使用codecs.open() するか、完全に使用しないでください。エンコーディングなしでcodecs.open()は、単にopen().

ここでは、Unicode 値を処理するために、開いているファイルのコーデックを指定する必要がありますunicodeまた、ASCII 文字を超える場合は、リテラル値を使用する必要があります。ソース ファイルのエンコーディングを指定するか、データに Unicode エスケープ コードを使用します。

# -*- coding: utf-8 -*- 
import os
import codecs

dirpath = u"C:\\Users\\user\\path\\to\\textfiles"
filenames = os.listdir(dirpath)

with codecs.open(r'C:\Users\user\path\to\output.txt', 'w', encoding='utf8') as outfile:
    for fname in filenames:
        currentfile = os.path.join(dirpath, fname)
        with codecs.open(currentfile, encoding='utf8') as infile:
            outfile.write(fname + '\n\n')
            for line in infile:
                line = line.replace(u"´ı", u"i")
                line = line.replace(u"ï¬", u"fi")
                line = line.replace(u"fl", u"fl")
                outfile.write (line)

これは、UTF-8 コーデックを使用してソースファイルを保存したことをインタープリターに指定し、u"´ı"コード ポイントが Unicode 値に正しくデコードされていることを確認します。 Unicode 値が出力ファイルに UTF-8 として書き出されるようにします。encodingcodec.open()

値もdirpathUnicode 値であることに注意してください。Unicode パスを使用すると、Unicode ファイル名が返されます。これは、それらのファイル名に非 ASCII 文字が含まれている場合に不可欠です。os.listdir()

これをすべて行わないと、ソース コードのエンコードがファイルから読み取ったデータと一致せず、エンコードされたバイトの間違ったセットをいくつかの ASCII 文字に置き換えようとしている可能性があります。

于 2013-06-11T11:13:41.243 に答える