【问题标题】:Python 3, can I tell if a file opened in binary mode contains text?Python 3,我可以判断以二进制模式打开的文件是否包含文本?
【发布时间】:2019-08-29 22:47:39
【问题描述】:

我正在将一些代码从 python 2 升级到 python 3。

有打开和读取文件的功能。在 Python 2 中,无需指定二进制模式或字符串。在 Python 3 中,我应该指定模式。

python 2 代码为:

with open(f_path, mode=open_mode) as fp:
    content = fp.read()

这给我带来了问题,因为它被各种其他函数调用,而我不一定事先知道文件类型。 (有时数据被写入 zip 文件,有时数据通过 HTTP 端点返回)。

我预计大多数数据将是二进制图像文件,但也会出现 CSV 和文本文件。

打开未知类型的文件并检测它是二进制数据还是字符串数据的最佳方法是什么?

是否可以例如以二进制模式打开文件,然后检测到它包含文本并转换它(或者生成异常并改为以字符串模式打开)?

【问题讨论】:

  • 您是否担心除 ASCII/UTF-8 之外的任何替代编码?如果是这样,请使用 chardet。如果没有,那么就按照下面的建议使用 binaryornot。
  • 我希望大多数文本文件都以 UTF-8 编码,尽管用户可以上传他们需要的任何内容。我将尝试使用 binaryornot 看看是否可行。

标签: python-3.x file


【解决方案1】:

你可以试试 binaryornot 库。

pip install binaryornot

然后在代码中:

from binaryornot.check import is_binary
is_binary(f_path)

这是他们的文档:

https://pypi.org/project/binaryornot/

【讨论】:

  • Chardet 可能是补充它的好方法。 chardet 的弱点是不直接检测二进制(它会尝试检测文本编码,并且通常在二进制时返回一些随机文本编码,概率很小),但如果性能不是问题,您可以同时使用两者。
  • 是的,我删除了我的评论并将其作为对 OP 的评论。顺便说一句,答案很好。
  • 到目前为止 binaryornot 做我想要的。我将再测试几个案例,看看我是否真的需要 chardet。
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2015-03-21
相关资源
最近更新 更多