gpt4 book ai didi

python - 如何检测Python中未解码的字符?

转载 作者:太空宇宙 更新时间:2023-11-03 17:27:20 25 4
gpt4 key购买 nike

我从 csv 文件获取数据,对其进行处理,然后将其写入文本模板。

当我遇到无法编码的字符时,就会出现问题。

例如,当我遇到用中文编写的值时,当我使用某种 csv 编辑器(例如适用于 Linux 的 LibreOffice Calc)打开它时,所选字段为空。

但是当我在脚本中通过 csv.reader 获取数据时,我可以看到它实际上是一个尚未正确解码的字符串。当我尝试将其写入模板时,我得到了这个奇怪的 SUB 字符串。

这里是问题的分割:

for row in csv.DictReader(csvfile):
# take value from the row and store it in a dictionary
....
# take the values from the dictionary and write them to a template
with open('template.txt', 'r+') as template:
src = Template(template.read())
content = src.substitute(rec)

with open('myoutput.txt', 'w') as bill:
bill.write(content)

template.txt 看起来像这样:

$name
$address
$city
...

所有这些都会生成如下所示的 txt 文件:

Bill
North Grove 14
Scottsdale
...

如果任何字典值为空,例如空字符串 '',我的模板渲染函数会忽略该标记,因此,例如,如果特定行中缺少 address 属性,则输出将为

Bill
Scottsdale
...

当我尝试对中文数据执行此操作时,我的函数确实会写入数据,因为相关字符串不为空。当我将它们写入模板时,最终结果如下所示:

    SUB
SUB
Hong Kong
...

如何正确显示我的数据?还有一种方法可以跳过该数据,例如可以尝试解码数据,如果不成功,则将其转换为空字符串。附: try except 在这里不起作用,因为 mystring.encode('utf-8')mystring.encode('latin-1') 将对字符串进行编码,但它仍然会作为垃圾输出。

编辑

打印出问题行后,有问题的值的输出如下:

{'Name': '\x1a \x1a\x1a', 'State': '\x1a\x1a\x1a'}

最佳答案

\x1aASCII substitute character 。这就是您在输出中看到“SUB”的原因。该字符通常被尝试解码字节但失败的程序用作替换。

您的 CSV 文件不包含有效数据。可能它是从包含有效数据的源开始生成的,但文件本身不再包含有效数据。

只是猜测:也许您是用 LibreOffice 打开文件然后保存的?

<小时/>

如果您想检查字符串是否包含 ASCII 不可打印字符,请使用以下命令:

def is_printable(data):
return all(c in string.printable for c in data)

如果您想删除 ASCII 不可打印字符:

def strip_unprintable(data):
return ''.join(c for c in data if c in string.printable)

如果您想处理 Unicode 字符串,请将 string.printable 中的 c 替换为:

ord(c) > 0x1f and ord(c) != 0x7f and not (0x80 <= ord(c) <= 0x9f)

(归功于What is the range of Unicode Printable Characters?)

关于python - 如何检测Python中未解码的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32381906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com