使用Python更改文本文件的编码:这是不可能的

2024-10-01 13:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想全部转换文件。所以我尝试在Windows10中使用Python,从Powershell(使用pythonv3.6.2)或CygWin(使用pythonv2.7.13)调用Python。我看到codecs和{}都用于这个工作,并且有评论说io是Python3的正确方法。在

但是文件不会被转换--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()而不使用blocksize,而且最初,编码的指定方式略有不同。它们都成功地复制了文件,但没有按预期对它们进行编码。在


Tags: 文件pathioimportsrc编码ifos
1条回答
网友
1楼 · 发布于 2024-10-01 13:28:30

ASCII是许多编码的通用子集。它是UTF-8、Latin-1和cp1252的一个子集,也是整个ISO-8859系列的一个子集,它有俄语、希腊语等的编码。如果你的文件真的是ASCII码,就没有什么可转换的了,你的系统只会说“cp1252”,因为这些文件与此兼容。您可以添加一个BOM来将一个文件标记为UTF(encodingutf-8-sig),但坦率地说,我不明白这一点。UTF实际上并不需要它,因为UTF文件可以通过多字节字符的结构进行识别。在

如果您想尝试编码,请使用包含非ASCII字符的文本:法语、俄语、中文,甚至英语中带有重音符号的单词(或者微软应用程序喜欢插入的愚蠢的直接引语)。把“Wikipédia en français”保存在一个文件中,然后重复你的实验,你会得到非常不同的结果。在

我强烈建议使用python3来实现这一点,也建议使用python3进行字符编码。Python2编码方法导致了许多毫无意义的混乱,事实上这也是破坏兼容性和引入Python3的主要原因之一。 另外,在Python3中,您只需将open()encoding参数一起使用。您不需要任何模块来更改编码。在

相关问题 更多 >