我需要在Python中将一堆文件转换为utf-8,并且我在“转换文件”部分遇到了问题。
我想做的等同于:
iconv -t utf-8 $file > converted/$file # this is shell code
谢谢!
发布于 2008-10-10 13:59:08
您可以像这样使用codecs module:
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)
编辑:添加BLOCKSIZE
参数来控制文件块大小。
发布于 2008-10-10 14:07:08
在一个小测试中,这对我很有效:
sourceEncoding = "iso-8859-1"
targetEncoding = "utf-8"
source = open("source")
target = open("target", "w")
target.write(unicode(source.read(), sourceEncoding).encode(targetEncoding))
发布于 2008-10-10 16:14:46
谢谢你的回复,它起作用了!
由于源文件采用混合格式,因此我添加了一个按顺序尝试的源格式列表(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的替代方法)
https://stackoverflow.com/questions/191359
复制相似问题