问题描述
我正在解析ISO-8859-1
且其中包含中文,日文,韩文字符的文件。
import os
from os import listdir
cnt = 0
base_path = 'data/'
cwd = os.path.abspath(os.getcwd())
for f in os.listdir(base_path):
path = cwd + '/' + base_path + f
cnt = 0
with open(path,'r',encoding='ISO-8859-1') as file:
for line in file:
print('line {}: {}'.format(cnt,line))
cnt +=1
代码可以运行,但是会打印出损坏的字符。其他stackoverflow问题建议我使用编码和解码。例如,对于韩文,我尝试
file.read().encode('latin1').decode('euc-kr')
,但是什么也没做。我还尝试使用utf-8
将文件转换为iconv
,但是在转换后的文本文件中字符仍然损坏。
任何建议将不胜感激。
解决方法
对不起,没有。 ISO-8859-1不能包含任何中文,日文或韩文字符。代码页最初不支持它们。
您在代码中所做的是让Python假定文件采用ISO-8859-1编码,并返回 Unicode 字符(即字符串的构建方式)。如果您未在encoding
中指定open()
参数,则默认值为假设UTF-8编码在文件中使用 ,并且仍以Unicode返回 >,即未指定任何编码的逻辑字符。
现在的问题是文件中的那些CJK字符如何编码。如果您知道答案,则只需在open()
中输入正确的编码参数即可,它立即起作用。假设您所说的是EUC-KR,代码应为:
with open(path,'r',encoding='euc-kr') as file:
for line in file:
print('line {}: {}'.format(cnt,line))
cnt +=1
如果您感到沮丧,请查看chardet。它应该可以帮助您检测文本的编码。示例:
import chardet
with open(path,'rb') as file:
rawdata = file.read()
guess = chardet.detect(rawdata) # e.g. {'encoding': 'EUC-KR','confidence': 0.99}
text = guess.decode(guess['encoding'])
cnt = 0
for line in text.splitlines():
print('line {}: {}'.format(cnt,line))
cnt +=1