使用Python更改文本文件的编码:它不会发生

时间:2017-10-25 00:14:12

标签: python windows encoding utf-8

在以任何方式复制或几乎触摸文件时,Windows会将其编码更改为默认值1252:Western European。在我正在使用的文本编辑器EditPad Pro Plus中,我可以看到并转换编码。我相信这种转换是有效的,因为我一直在使用Windows和UNIX之间的文件,而且我知道当我的文本编辑器更改编码时,文件在UNIX中正确读取,之前它们会导致问题。

我想整体转换文件。所以我试图在Windows 10中使用Python,从Powershell(使用Python v 3.6.2)或CygWin(使用Python v 2.7.13)调用。我看到codecsio都用于工作,评论io是Python 3的正确方法。

但文件未转换 - codecsio。下面的脚本成功复制了文件,但我的文本编辑器仍然将它们报告为1252。 UniversalDetector(在下面脚本的注释部分中)将其编码报告为“ascii”。

要使这些转换成功,需要做些什么?

import sys
import os
import io
#from chardet.universaldetector import UniversalDetector

BLOCKSIZE = 1048576
#detector = UniversalDetector()

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

def main():
    src_dir = ""

    if len( sys.argv ) > 1:
        src_dir = sys.argv[1]

    if os.path.exists( src_dir ):
        dest_dir = src_dir[:-2]
        for file in os.listdir( src_dir ):
            with io.open( os.path.join( src_dir, file ), "r", encoding='cp1252') as source_file:
                with io.open( os.path.join( dest_dir, file ), "w", encoding='utf8') as target_file:
                    while True:
                        contents = source_file.read( BLOCKSIZE )
                        if not contents:
                            break
                        target_file.write( contents )
#print( "Encoding of " + file + ": " + get_encoding( os.path.join( dest_dir, file ) ) )
    else:
        print( 'The specified directory does not exist.' )

if __name__ == "__main__":
    main()

我尝试了一些变体,例如将文件作为UTF8打开,调用read()而没有块大小,最初,编码的指定方式略有不同。它们都成功复制了文件,但没有按预期编码。

1 个答案:

答案 0 :(得分:2)

ASCII是许多编码的通用子集。它是UTF-8,Latin-1和cp1252--以及整个ISO-8859系列的子集,其中包含俄语,希腊语等编码。如果您的文件实际上是ASCII,则无需转换任何内容和系统只是说“cp1252”,因为这些文件与兼容。您可以添加BOM以将文件标记为UTF(编码utf-8-sig),但坦率地说,我没有看到这一点。 UTF实际上并不需要它,因为UTF文件可以通过多字节字符的结构识别。

如果您想尝试编码,请使用包含非ASCII字符的文本:法语,俄语,中文,甚至带有一些重音词的英语(或Microsoft应用程序喜欢插入的愚蠢的定向引号)。将“Wikipédiaenfrançais”保存在文件中并重复您的实验,您将获得截然不同的结果。

强烈建议使用Python 3,以及其他任何与字符编码有关的内容。 Python 2编码方法导致了许多无意义的混淆,实际上是打破兼容性和引入Python 3的主要原因之一。 作为奖励,在Python 3中,您可以使用带有open()参数的encoding。您不需要任何模块来更改编码。