【问题标题】:Removing all non-printable ASCII UTF-8 characters in a text file删除文本文件中所有不可打印的 ASCII UTF-8 字符
【发布时间】:2016-08-18 04:24:16
【问题描述】:

我有一个要在记事本++ 中查看的文本文件。该文件在一列中包含爬行动物亚种名称的列表,然后我有 DNA 序列 ID,这些 ID 由我认为只是空白的部分分隔。但是当我打开文本文件时,似乎空间被GSVT等不可打印的字符占用。

例如:

亚种名称、不可打印字符、序列 ID、不可打印字符、序列 ID...等等,直到下一行:

黄鳝GSGSGSGSGS36660VT4560VT23400

有没有办法从我的文本文件中删除所有这些不可打印的GSVT 字符?当我尝试打印文件中的每一行时,由于我在记事本++中看到的这些控制字符,我不断得到奇怪的间距。有什么办法可以让它正常打印,而不会因不可打印字符而造成所有间距中断?

更新:

我使用 user312016's advice 并为 Python 安装了 chardet。我发现文件是用 UTF-16LE 编码的。

我从 Dropbox 的教授那里得到了文件。文件被压缩了,我所做的只是解压缩文件。这是一个.txt 文件,我敢肯定他没有提到使用另一个脚本来解析数据。

当我单击解压缩的.txt 文件以在常规记事本中打开它时,它会显示奇怪的符号,我认为这是我在记事本++ 中打开文件时看到的GSs 和VTs。

【问题讨论】:

  • UTF-8 向后兼容 ascii,就像许多其他编码/代码页一样。所有 ascii 字符(字符代码 =128),因此许多只关心 ascii 字符的函数在 utf-8 编码的字节数组中表现正确。出于这个原因,您可以简单地将文件作为字节数组读取(不关心编码)并处理 ascii 'GS's 和 'VT's。
  • 好的,所以我使用了 user312016 的建议并安装了 chardet。我发现该文件是用 UTF-16LE 编码的。当我尝试打印文件中的每一行时,由于我在记事本++中看到的这些不可读的字符,我不断得到奇怪的间距。有什么方法可以让它正常打印,而不会因为不可读的字符而造成所有间距中断?谢谢
  • 我从 Dropbox 的教授那里得到了文件。文件被压缩了,我所做的只是解压缩文件。当我单击解压缩文件打开常规记事本时,它返回奇怪的符号,我假设这是我在记事本上打开文件时看到的 GS 和 VT++
  • 你可能想问你的教授他们是如何编码文件的
  • 这是一个.txt 文件,我敢肯定他没有提到另一个脚本来解析数据。

标签: utf-8 text-files ascii


【解决方案1】:

当在“文本”文件中遇到奇怪字符时,正确的做法是联系创建该文件的人(可能只是通过阅读他们网站上的其他地方)以找出它们是什么试图送你。像字符编码这样的元信息,更不用说像文件和记录格式这样更复杂的概念了,大部分都是带外传输的,这意味着你最多只能在文件本身中找到它们的提示。

但是,在这种情况下,您可能有一个“纯文本”文件,该文件使用一些更晦涩的 ASCII control codes 来分隔表中的记录和字段。

您遇到的组分隔符及其同级分隔符旨在像您所拥有的那样分隔 ASCII 文本数据的字段和行(以及更奇怪的细分)。这是我上面链接的*图表中的相关行,精简了一些:

       Python
Dec    String    Abbr  Keyboard  Name
--------------------------------------
11     '\x0b'    VT    Ctrl-K    Vertical Tab

28     '\x1c'    FS    Ctrl-\    File Separator
29     '\x1d'    GS    Ctrl-]    Group Separator
30     '\x1e'    RS    Ctrl-^    Record Separator
31     '\x1f'    US    Ctrl-_    Unit Separator

您遇到的该组分隔符字符串可能表示一组彼此相邻的空组,就像一组彼此相邻的逗号 ('Obama,Barack,,,,44') 表示电子表格的 CSV 表示中的空单元格一样.垂直制表符可能分隔“行”(代替或补充上述分隔符之一)。

但这一切都只是猜测。该文件很可能根本不是“纯文本”,而是某些数据库或电子表格程序的导出格式。同样,发布数据的人也应该在某处解释文件格式......如果没有,并且如果您无法联系到他们,那么您所拥有的就是有根据的猜测。

【讨论】:

  • 感谢您的信息,我给教授发了电子邮件。所以现在我们等待
  • @SweetJD14:我有点惊讶他或她没有告诉你文件的开头格式。
  • 是的哈哈,我敢肯定这是一个诚实的错误。
  • @SweetJD14 你的教授回复了吗?那是什么样的文件?这个问题还应该悬而未决吗?
【解决方案2】:

您必须知道您的文件采用哪种编码方式进行编码。 您的问题来自这样一个事实,即您正在以不同且不兼容的编码对文件进行解码,因为它是在存储设备上写入的。

然后,您只需要执行以下操作:

with open('file.txt', rb) as f:
    file_decoded = f.read().decode('the_encoding_of_the_file')

如果您不知道编码,则无法可靠地执行此操作。但是您仍然可以使用一个库来尝试确定编码,例如chardet

【讨论】:

  • 啊,我将如何查找文件的编码方式?它在一个 zip 文件中,然后我将其解压缩并保存为文本文件。有没有办法可以向后工作以找出文件是如何编码的?
  • 这将如何改变操作员在记事本中看到的内容?
  • @PadraicCunningham 这几乎是同一个问题,操作人员只需更改记事本设置以使用正确的编码打开文件。
  • Notepad++ 不编码为 UTF-16LE。我应该改用什么 IDE?谢谢
  • @SweetJD14 您确定您的文件是使用 unicode 系列编码进行编码的吗?
最近更新 更多