在 python 中读取 ISO-8859-1 文件时损坏的 CJK 数据
broken CJK data when reading ISO-8859-1 file in python
我正在解析一些 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
代码运行但打印出损坏的字符。其他 Whosebug 问题建议我使用编码和解码。例如,对于韩语文本,我试过
file.read().encode('latin1').decode('euc-kr')
,但这并没有做任何事情。我还尝试使用 iconv
将文件转换为 utf-8
,但转换后的文本文件中的字符仍然损坏。
如有任何建议,我们将不胜感激。
抱歉,没有。 ISO-8859-1 中不能包含任何中文、日文或韩文字符。代码页一开始就不支持它们。
您在代码中所做的是要求 Python 假设文件采用 ISO-8859-1 编码并且 return 个字符 采用 Unicode (这就是字符串的构建方式)。如果您没有在 open()
中指定 encoding
参数,默认情况下将假定 UTF-8 编码在文件 中使用 并且仍然 return 在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
我正在解析一些 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
代码运行但打印出损坏的字符。其他 Whosebug 问题建议我使用编码和解码。例如,对于韩语文本,我试过
file.read().encode('latin1').decode('euc-kr')
,但这并没有做任何事情。我还尝试使用 iconv
将文件转换为 utf-8
,但转换后的文本文件中的字符仍然损坏。
如有任何建议,我们将不胜感激。
抱歉,没有。 ISO-8859-1 中不能包含任何中文、日文或韩文字符。代码页一开始就不支持它们。
您在代码中所做的是要求 Python 假设文件采用 ISO-8859-1 编码并且 return 个字符 采用 Unicode (这就是字符串的构建方式)。如果您没有在 open()
中指定 encoding
参数,默认情况下将假定 UTF-8 编码在文件 中使用 并且仍然 return 在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