【发布时间】:2019-06-27 23:21:18
【问题描述】:
我的公司正在使用一个数据库,我正在编写一个与该数据库交互的脚本。已经有一个脚本用于将查询放到数据库中,并且该脚本将根据查询从数据库返回结果。
我正在使用 unix 环境,我在我的脚本中使用该脚本从数据库中获取一些数据,并且我正在将查询的结果重定向到一个文件。现在,当我尝试读取此文件时,我收到一条错误消息-
UnicodeEncodeError: 'ascii' codec can't encode character '\u2013' in position 9741: ordinal not in range(128)
我知道由于文件的编码,python 无法读取文件。文件的编码不是 ascii,这就是错误出现的原因。我尝试检查文件的编码并尝试使用自己的编码读取文件。
我使用的代码是-
os.system("Query.pl \"select title from bug where (ste='KGF-A' AND ( status = 'Not_Approved')) \">patchlet.txt")
encoding_dict3={}
encoding_dict3=chardet.detect(open("patchlet.txt", "rb").read())
print(encoding_dict3)
# Open the patchlet.txt file for storing the last part of titles for latest ACF in a list
with codecs.open("patchlet.txt",encoding='{}'.format(encoding_dict3['encoding'])) as csvFile
readCSV = csv.reader(csvFile,delimiter=":")
for row in readCSV:
if len(row)!=0:
if len(row) > 1:
j=len(row)-1
patchlets_in_latest.append(row[j])
elif len(row) ==1:
patchlets_in_latest.append(row[0])
patchlets_in_latest_list=[]
# calling the strip_list_noempty function for removing newline and whitespace characters
patchlets_in_latest_list=strip_list_noempty(patchlets_in_latest)
# coverting list of titles in set to remove any duplicate entry if present
patchlets_in_latest_set= set(patchlets_in_latest_list)
# Finding duplicate entries in list
duplicates_in_latest=[k for k,v in Counter(patchlets_in_latest_list).items() if v>1]
# Printing imp info for logs
print("list of titles of patchlets in latest list are : ")
for i in patchlets_in_latest_list:
**print(str(i))**
print("No of patchlets in latest list are : {}".format(str(len(patchlets_in_latest_list))))
Query.pl 是 perl 脚本,用于从数据库中获取查询结果。我为“patchlet.txt”(用于存储 HSD 结果的文件)获取的编码是:
{'encoding': 'Windows-1252', 'confidence': 0.73, 'language': ''}
即使我为读取文件提供了相同的编码,我也会收到错误。
请帮我解决这个错误。
编辑: 我正在使用python3.6
EDIT2:
在输出结果时出现错误,文件中有一行包含一些未知字符。该行看起来像:
由于某些故障导致 vtrace 无法与某些跟踪一起使用。
我正在使用 gvim,在 gvim 中,“vtrace”看起来像“~Vvtrace”。然后我在数据库中手动检查了这个字符,这个字符是“-”,根据我的键盘,它既不是连字符也不是下划线。这些字符造成了问题。
我也在linux环境下工作。
编辑 3:
我添加了更多代码来帮助跟踪错误。此外,我还突出显示了一个“打印”语句 (print(str(i))) 我收到错误。
【问题讨论】:
-
encoding='windows-1252'(注意小写'w')或encoding='cp1252'应该可以工作 - 请参阅codec names and aliases -
不,两者都不起作用,仍然出现相同的错误-@snakecharmerb
-
你能分享一个minimal reproducible example,让我们知道你正在运行哪个版本的python?还有追溯?
-
我猜问题是在您输出结果时发生的,而不是在读取输入时发生的。但是,如果没有一些重现问题的代码和数据,或者至少是代码和回溯,就只能猜测。
-
再次,回溯来自您未显示的代码。
with codecs.open之后的某些东西可能只是试图将print放到 Python 无法确定正确编码的地方。
标签: python python-3.x character-encoding ascii