气流工作人员在使用熊猫解析文件时不了解文件编码



使用以下代码:

import pandas as pd
filename = r"/path/to/my/file.csv"
with open(filename) as f:
data_frame = pd.read_csv(f,
usecols=['col1', 'col2'],
parse_dates=['DateProd', 'DateStart', 'DateEnd'],
header=0,
delimiter=';',
encoding='latin-1')
print(data_frame)

在本地执行此操作时,它会打印具有适当强调功能的预期数据帧。 在远程工作人员的气流任务中执行时,它会失败并显示以下错误:

UnicodeDecodeError:"utf-8"编解码器无法解码位置 2581 中的字节0xe9:延续字节无效

在查看完整的调试跟踪跟踪(抱歉,敏感信息,无法完全提供(时,我在堆栈跟踪中看到明确指定了 encoding='latin-1',并且它仍然失败并出现 UnicodeDecodeError 错误。 有人注意到类似的问题吗? 我一直在兜圈子,尝试尽可能多的编码,但似乎没有任何效果。

我忘了提到该文件是桑巴共享上的远程文件。 无论我尝试直接使用 smbclient.open(( 读取它,还是在本地复制它然后打开它,我都会得到相同的结果:UnicodeDecodeError。 当我在本地尝试同样的事情时(直接从桑巴共享中读取,或复制它(,一切似乎都很好,我注意到我什至不需要指定编码,它会自动找到它,并且重音将正确显示。

另一个更新 :似乎文件是否从桑巴共享中读取都没有区别。 我设法运行了远程工作者上使用的 docker 映像,我可以使用本地托管的所有内容重现此问题,无论我之前打开文件,还是在将其交给熊猫之前完全阅读它,或者我只是将文件名提供给read_csv。

引擎似乎也没有区别:指定engine='python'或engine='c'会产生相同的结果。

另一个更新 :似乎新的 ubuntu docker 映像也发生了同样的问题。 我猜在能够解析它们之前需要安装一些语言环境。

我已经想通了。

在 Windows 计算机上,默认情况下编码似乎不同。 我什至不必指定编码即可使其工作。 不在容器中。 因此,我需要在打开容器中的文件时指定编码。 以下应该有效:

import pandas as pd
filename = r"/path/to/my/file.csv"
with open(filename, encoding='latin-1') as f:
data_frame = pd.read_csv(f,
usecols=['col1', 'col2'],
parse_dates=['DateProd', 'DateStart', 'DateEnd'],
header=0,
delimiter=';',)
# Notice the lack of encoding='latin-1' here.
print(data_frame)

但! SambaHook 本质上返回了一个 pysmbclient 的 SambaClient。 当您尝试使用此 Sambaclient 打开文件时,无法指定文件的编码。 因此,在本地,在Windows机器上,一切似乎都正常工作。 在 linux 容器中,它因 UnicodeDecodeError 而失败。 在后台查看,我发现它基本上是在简单地对文件调用 open(( 之前复制文件。

现在,这是我的解决方案:将文件与 SambaHook 返回的 SambaClient 一起复制到临时文件中,使用正确的编码打开它,让熊猫解析它。 我将看看我能做些什么来改进 SambaHook 和 pysmbclient,以便其他人可以在打开文件时指定编码。

最新更新