cdfmlr / pyflowchart

Python codes to Flowcharts

Home Page:https://pypi.org/project/pyflowchart/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

windows: UnicodeDecodeError: 'gbk' codec can't decode

BackMountainDevil opened this issue · comments

Env

  • windwos 10 amd64
  • py 3.9.0
  • pyflowchart 0.1.0

Err

code

# This is statement is required by the build system to query build info
if __name__ == '__build__':
    raise Exception

# cube.py
# Converted to Python by Jason Petrone 6/00

import sys

try:
    from OpenGL.GLUT import *
    from OpenGL.GL import *
    from OpenGL.GLU import *
except:
    print("ERROR: PyOpenGL not installed properly")


def init():
    glClearColor(0.0, 0.0, 0.0, 0.0)
    glShadeModel(GL_FLAT)


def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(1.0, 1.0, 1.0)
    glLoadIdentity()  # clear the matrix
    # viewing transformation
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    glScalef(1.0, 2.0, 1.0)  # modeling transformation
    glutWireCube(1.0)
    glFlush()


def reshape(w, h):
    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0)
    glMatrixMode(GL_MODELVIEW)


glutInit(sys.argv)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
glutInitWindowSize(500, 500)
glutInitWindowPosition(100, 100)
glutCreateWindow('cube')
init()
glutDisplayFunc(display)
glutReshapeFunc(reshape)

glutMainLoop()

Exceptioin

$ python -m pyflowchart cube.py
Traceback (most recent call last):
  File "D:\Program Files\Python\Python39\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "D:\Program Files\Python\Python39\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "D:\Program Files\Python\Python39\lib\site-packages\pyflowchart\__main__.py", line 33, in <module>
    main(args.code_file, args.field, args.inner)
  File "D:\Program Files\Python\Python39\lib\site-packages\pyflowchart\__main__.py", line 16, in main
    code = code_file.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 355: illegal multibyte sequence

另一个代码证明了不是code问题,也爆出了同样的错误,因此错误是由于该模块本身的问题...但是我目前的知识还不足以维护这个模块...

code2

import math
#  计算磁环的横截面积F  cm^2
def calMagnetRingCrossArea(D, d, h):
    return (0.5 * h * (D + d))

#  计算磁环平均长度l  cm
def calMagnetRingLength(D, d):
    return (0.5 * (D + d) * math.pi)

#  计算磁环绕线电感的电感L  mH
def calInductance(u, N, F, l):
    return 0

#  计算线圈匝数N
def calRingNumber(u, L, F, l):
    return math.sqrt((L * l * math.pow(10,5))/(0.4 * math.pi * u * F))
    
u = 75    
D = 3.3
d = 1.99
h = 1.07
L = 50.0
F = calMagnetRingCrossArea(D,d,h)
l = calMagnetRingLength(D,d)
N = calRingNumber(u,L,F,l)
print(N)

首先感谢你的反馈,对给你带来的麻烦表示歉意。

这个问题应该和 f312d64 类似,是中文环境的 Windows 下读取文件时编码的问题。

我这边没有 Windows 的机器,我用 mac 做了一些简单的尝试,但没能复现问题,所以可能需要你进一步提供更多的信息来帮助确定 BUG 所在。@BackMountainDevil 麻烦可以看一下你的 cube.py 文件是什么编码的吗?


具体的方法是:利用 VSCode 等编辑器打开文件,在右下角会有显示。例如下图的文件是 UTF-8 编码的:

how-to-get-encoding

两个文件都是UTF-8编码,通过VS Code/记事本右下角的状状态栏都是UTF-8.
编码修改为gbk再次尝试还是报错

我把模块里面的main代码进行了修改

code = code_file.read().decode(encoding='utf-8', errors='ignore')
code = code_file.read().decode(encoding='utf-8')

无论修改为哪一个,错误都是那样

code = code_file.read().decode(encoding='utf-8')
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 215: illegal multibyte sequence
code = code_file.read().decode(encoding='utf-8', errors='ignore')
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 215: illegal multibyte sequence

哈哈,这个修改思路和我想的一样,但你的实现有点小问题。应该还需要多改一行代码:

if __name__ == '__main__':
    parser.add_argument('code_file',  type=argparse.FileType('r'))

'r' 要改成 'rb',不然你是在对 str 做 decode。

你试试

模块中读取的编码是cp936 == gbk

def main(code_file, field, inner):
    print("code_file: ", code_file, "\nfield: ", field, "\ninner: ", inner)
    code = code_file.read().decode(encoding='utf-8', errors='ignore')
    print(code)
    flowchart = Flowchart.from_code(code, field=field, inner=inner)
    print(flowchart.flowchart())

## output
code_file:  <_io.TextIOWrapper name='cube.py' mode='r' encoding='cp936'>
field:
inner:  True

但是无论指定encoding为cp936还是gbk都会报错UnicodeDecodeError: 'gbk' codec can't decode byte
参数设置失效这我还是头一回知道

cube.py编码确实是utf-8

path = "D://Documents//CAU\Lion//repositiries//Python//pyopengl//beginner//cube.py"
with open(path, 'r', encoding='utf') as text:
    words = text.read()
    print(words)

无论是在VS Code里运行还是powershell运行都是正确运行的,但是如果指定为gbk或者不设置encoding就会报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 215: illegal multibyte sequence

open 的文档:https://docs.python.org/3/library/functions.html#open

里面说不指定 encoding 的话默认用 platform dependent 的编码。而据我了解,中文的 Windows 系统使用 GBK 编码。所以不指定 encoding 的话,就是用 GBK 去解码。所以无法解码 UTF-8 的文件。

我在 c7410be 里添加了一些自动检测文本编码的代码。应该可以解决你的问题了。但我仍然没有借到 Windows 电脑做测试😂,你可以用 #4_file_decode_error 这个分支里的代码试试😂

裂开...格式修改为gbk格式就行了,sorry

emmm,但是你不应该把编码改成 GBK 的,Python3 默认用 UTF-8 编码

裂开...格式修改为gbk格式就行了,sorry

试试这个:

我在 c7410be 里添加了一些自动检测文本编码的代码。应该可以解决你的问题了。但我仍然没有借到 Windows 电脑做测试😂,你可以用 #4_file_decode_error 这个分支里的代码试试😂

https://github.com/cdfmlr/pyflowchart/blob/%234_file_decode_error/pyflowchart/__main__.py
NB,我把你刚才更新后的代码cv之后可以了!!!

这个问题在新发布的 v0.1.1 版本中应该解决了🎉,pip 更新即可使用。

$ pip3 install -U pyflowchart

再次感谢 @BackMountainDevil 🙏

P.S. 关于 PyFlowchart 的完整用法,敬请参考 README