【问题标题】:Reading input files with ASCII 215 as delimiter以 ASCII 215 作为分隔符读取输入文件
【发布时间】:2013-12-15 01:52:19
【问题描述】:

我正在尝试从包含由 ASCII 值 215 分隔的单词对的文件中读取。当我运行以下代码时:

f = open('file.i', 'r')
for line in f.read().split('×'):
    print line

我得到一个看起来像垃圾的字符串。这是我的输入示例:

abashedness×N
abashment×N
abash×t
abasia×N
abasic×A
abasing×t
Abas×N
abatable×A
abatage×N
abated×V
abatement×N
abater×N
Abate×N
abate×Vti
abating×V
abatis×N
abatjours×p
abatjour×N
abator×N
abattage×N
abattoir×N
abaxial×A

这是上面代码运行后的输出:

z?Nlner?N?NANus?A?hion?hk?hhn?he?hanoconiosis?N

我的目标是最终将其读入元组列表或类似性质的内容中,但我无法将数据打印出来。

感谢大家的帮助。

【问题讨论】:

  • print repr(line) 产生什么?
  • 没有 ASCII 值 215 这样的东西。它是一个在 ASCII 编码中没有意义的字节。
  • @user2357112:它甚至不是一个字节。 '×' 是 utf-8 中的两个字节。

标签: python file input delimiter


【解决方案1】:

嗯,有两件事:

  • 您的来源可能是 Unicode!使用逃生通道并确保安全。
  • 以二进制模式读取。
with open("file.i", "rb") as f:
    for line in f.read().split(b"\xd7"):
        print(line)

【讨论】:

  • 请不要将源代码称为“Unicode”。它可能使用来自 Unicode 标准的 encoding ,但这并不能使它成为 Unicode。最好是 UTF-8 或 UTF-16 或 UTF-32。
  • b'×'b'\xc3\x97'(utf-8 源代码编码)。输入文件的编码可能与脚本不同。
  • @MartijnPieters:是的,它可能是其中任何一个,它会破坏所有这些。因此,Unicode。
  • @J.F.Sebastian: 提问者指定了 ASCII
  • @minitech:提问者很困惑。回答者应该知道×不是ascii。
【解决方案2】:

字符是分隔单词和词性的,但每个单词仍然在自己的行中:

with open('file.i', 'rb') as handle:
    for line in handle:
        word, pos = line.strip().split('×')

        print word, pos

您的代码拆分了整个 文件,因此您最终得到了N\nabatableN\nAbateVti\nabating 之类的词。

【讨论】:

    【解决方案3】:

    要将文件中的字节解释为文本,您需要知道其字符编码。 There Ain't No Such Thing As Plain Text。您可以使用codecs 模块阅读文本:

    import codecs
    
    with codecs.open('file.i', 'r', encoding='utf-8') as file: 
         for line in file:
             word, sep, suffix = line.partition(u'\u00d7')
             if sep:
                print word
    

    使用文件的实际字符编码代替 utf-8 占位符,例如 cp1252

    字符串文字中的非 ascii 字符需要在脚本顶部声明源字符编码,因此我使用了 unicode 转义:u'\u00d7'

    【讨论】:

      【解决方案4】:

      感谢您的帮助,我能够将这段代码组合在一起,该代码返回包含我正在寻找的列表的列表。

      with open("mobyposi.i", "rb") as f:
          content = f.readlines()
          f.close()
          content = content[0].split()
          for item in content:
              item.split("\xd7")
      

      确实是 unicode 格式!但是,上面描述的实现丢弃了 unicode 值之后和换行符之前的文本。

      编辑:能够减少到:

      with open("mobyposi.i", "rb") as f:
          for item in f.read().split():
              item.split("\xd7")
      

      【讨论】:

      • 代码没有意义。 f.readlines() 返回行列表。 content[0] 是第一行。 .split() 尝试在空白处分割行。该行中的单词对之间没有任何内容,因此它将该行作为一个列表返回,其中包含唯一的项目——第一行本身。然后你用一个字节参数调用.split("\xd7")(它在utf-8中是×字符的第二个字节,即在这种情况下你会在一个字符内分割)并且你最后不使用结果。还有with-statement 关闭文件,不要自己调用f.close()
      • 如果我保证我得到我想要的怎么办? f.readlines() 返回:"['abashedness\xd7N\rabashment\xd7N\rabash\xd7t\rabasia\xd7N\rabasic\xd7A\rabasing\xd7t\rAbas\xd7N\rabatable\xd7A\rabatage\xd7N\rabated\xd7V\rabatement\xd7N\rabater\xd7N\rAbate\xd7N\rabate\xd7Vti\rabating\xd7V\rabatis\xd7N\rabatjours\xd7p\rabatjour\xd7N\rabator\xd7N\rabattage\xd7N\rabattoir\xd7N\rabaxial\xd7A']" 然后我使用 content = content[0].split()
      • 您的数据使用回车 \r 作为换行符。如果您将文件作为二进制文件打开; \r 不会被识别为换行符。在这种情况下调用f.readlines() 毫无意义。你试过the code from my answercp1252 编码吗?鉴于数据,它不是唯一可能的字符编码,但它适用于这个特定的样本。
      猜你喜欢
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      相关资源
      最近更新 更多