我的公司正在使用数据库,我正在编写与该数据库交互的脚本。已经有一个脚本用于将查询放在数据库上,并且基于查询,该脚本将从数据库返回结果。
我正在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
编辑2:
在输出结果时,我遇到了错误,文件中有一行含有一些未知字符。该行如下所示:
“由于某些原因,vtrace不能与某些跟踪一起使用而导致失败。”
我正在使用gvim,在gvim中,“vtrace”看起来像“〜Vvtrace”。然后我手动检查了数据库中的这个字符,发现它是“-”,根据我的键盘,它既不是连字符也不是下划线。这些字符导致了问题。
另外,我正在Linux环境下工作。
编辑3:
我添加了更多的代码来帮助跟踪错误。我还突出显示了一个“print”语句(print(str(i))),在这里我遇到了错误。
with codecs.open
之后的某个地方,可能有一些尝试简单地向 Python 无法确定正确编码的位置进行print
的操作。 - tripleee