Python 拼凑将 UCS-2 (UTF-16?) 读取为 ASCII

2024-02-03

我对这个问题有点不知所措,所以请提前原谅我的术语。

我在 Windows XP 上使用 Python 2.7 运行它。

我发现一些 Python 代码可以读取日志文件,执行一些操作,然后显示一些内容。

什么,这还不够详细吗?好的,这是一个简化版本:

#!/usr/bin/python

import re
import sys

class NotSupportedTOCError(Exception):
    pass

def filter_toc_entries(lines):
    while True:
        line = lines.next()
        if re.match(r""" \s* 
                   .+\s+ \| (?#track)
                \s+.+\s+ \| (?#start)
                \s+.+\s+ \| (?#length)
                \s+.+\s+ \| (?#start sec)
                \s+.+\s*$   (?#end sec)
                """, line, re.X):
            lines.next()
            break

    while True:
        line = lines.next()
        m = re.match(r"""
            ^\s*
            (?P<num>\d+)
            \s*\|\s*
            (?P<start_time>[0-9:.]+)
            \s*\|\s*
            (?P<length_time>[0-9:.]+)
            \s*\|\s*
            (?P<start_sector>\d+)
            \s*\|\s*
            (?P<end_sector>\d+)
            \s*$
            """, line, re.X)
        if not m:
            break
        yield m.groupdict()

def calculate_mb_toc_numbers(eac_entries):
    eac = list(eac_entries)
    num_tracks = len(eac)

    tracknums = [int(e['num']) for e in eac]
    if range(1,num_tracks+1) != tracknums:
        raise NotSupportedTOCError("Non-standard track number sequence: %s", tracknums)

    leadout_offset = int(eac[-1]['end_sector']) + 150 + 1
    offsets = [(int(x['start_sector']) + 150) for x in eac]
    return [1, num_tracks, leadout_offset] + offsets

f = open(sys.argv[1])

mb_toc_urlpart = "%20".join(str(x) for x in calculate_mb_toc_numbers(filter_toc_entries(f)))

print mb_toc_urlpart

只要日志文件是“简单”文本,代码就可以正常工作(我很想说 ASCII,尽管这可能不精确/准确 - 例如 Notepad++ 表明它是 ANSI)。

但是,该脚本不适用于某些日志文件(在这些情况下,Notepad++ 会显示“UCS-2 Little Endian”)。

我收到以下错误:

Traceback (most recent call last):
  File "simple.py", line 55, in <module>
    mb_toc_urlpart = "%20".join(str(x) for x in calculate_mb_toc_numbers(filter_
toc_entries(f)))
  File "simple.py", line 49, in calculate_mb_toc_numbers
    leadout_offset = int(eac[-1]['end_sector']) + 150 + 1
IndexError: list index out of range

这个日志works http://dl.dropbox.com/u/20950646/works.log

这个日志breaks http://dl.dropbox.com/u/20950646/breaks.log

我相信是编码破坏了脚本,因为如果我只是在命令提示符下执行此操作:

type ascii.log > scrubbed.log

然后在 scrapbed.log 上运行脚本,脚本工作正常(这实际上对我的目的来说很好,因为没有丢失重要信息,并且我没有写回文件,只是打印到控制台)。

一种解决方法是在将日志文件传递给 Python 之前对其进行“清理”(例如,使用上面的类型管道技巧到一个临时文件,然后在其上运行脚本),但我想让 Python “忽略”编码如果它是可能的。我也不确定如何检测脚本正在读取的日志文件类型,以便我可以采取适当的行动。

我正在阅读this http://docs.python.org/howto/unicode and this http://www.joelonsoftware.com/articles/Unicode.html但我的眼睛仍然在他们的脑海中旋转,所以虽然这可能是我的长期策略,但我想知道是否有我可以使用的临时黑客。


codecs.open() http://docs.python.org/library/codecs.html#codecs.open将允许您使用特定编码打开文件,并且它将产生unicodes。您可以尝试一些,从最有可能到最不可能(或者该工具总是可以生成 UTF-16LE,但哈哈机会很大)。

Also, “Python 中的 Unicode,完全揭秘” http://farmdev.com/talks/unicode/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 拼凑将 UCS-2 (UTF-16?) 读取为 ASCII 的相关文章

随机推荐

  • aufs au_opts_parse:1155:docker[2010] 未知选项 dirperm1

    我安装了 Docker 现在 当我的 Ubuntu 14 04 Trusty 系统尝试启动时 我收到以下消息 aufs au opts parse 1155 docker 2010 unknown option dirperm1 这意味着什
  • 为什么 webpack 需要一个空扩展名

    我试图弄清楚为什么 webpack 需要这个空扩展名 Inside resolve extensions总是有这样的配置 extensions js jsx 为什么不能只是这样 extensions js jsx 在较新的 Webpack
  • 如何下载 TFS 搁置集

    我需要将 TFS 中的搁置集下载到本地文件夹 Visual studio 2010 有没有下载工具集的工具或插件 如果你只需要将文件从搁置集中获取到本地文件夹 这是一个正常的过程 称为Unshelve http msdn microsoft
  • 即使 IP 更改或浏览器数据已清除,我如何识别网站上的唯一用户?

    我正在开发一个视频流网站 我想计算每个视频的独特观看次数 我参考了互联网上的一些网站 甚至询问了其他一些程序员 他们说要么使用 cookie 要么使用会话 要么使用 IP 地址 但这些事情会随着时间的推移而改变 另外 如果可能的话 我们可以
  • 如何处理 AWS Athena 中的嵌入换行符

    我在 AWS Athena 中创建了一个表 如下所示 CREATE EXTERNAL TABLE IF NOT EXISTS default test line breaks col1 string col2 string ROW FORM
  • 是否可以训练斯坦福 NER 系统来识别更多命名实体类型?

    我现在正在使用一些 NLP 库 stanford 和 nltk 斯坦福大学我看到了演示部分 但只是想问是否可以使用它来识别更多实体类型 因此 目前斯坦福的 NER 系统 如演示所示 可以将实体识别为人 名称 组织或位置 但认可的组织仅限于大
  • 从给定节点开始有向图的 BFS 遍历

    我的基本理解广度优先搜索图的遍历是 BFS Start from any node Add it to queue Add it to visited array While queue is not empty Remove head f
  • 添加用于将 Word 注释中的标题提取到 Excel 中的代码

    我有一些代码用于将 Word 中的注释提取到 Excel 中 但是 它只提取一级标题 直接标题 我可以添加哪些代码来提取 Excel 中不同列中的不同标题级别 我可以按样式选择这些不同的标题级别吗 如果我使用 MyOwnHeading 样式
  • Maven:在 pom.xml 中配置并行构建

    Maven 具有执行并行构建的能力 https cwiki apache org confluence display MAVEN Parallel builds in Maven 3 https cwiki apache org conf
  • jQuery 支持“:invalid”选择器

    我收到以下控制台消息 16 04 01 292 Error Syntax error unrecognized expression unsupported pseudo invalid http localhost 8080 assets
  • JHipster:将根域重定向到 www

    我正在从事搜索引擎优化工作 我想https pomzen com https pomzen com被重定向到https www pomzen com https www pomzen com 是否可以在 JHipster 项目中完成 还是在
  • 防止表单提交后重新加载页面

    有没有办法检测并停止页面是否正在重新加载 我有一个页面 在成功提交其中存在的表单后正在重新加载 我想要一个事件侦听器来查看页面是否正在重新加载并应该阻止它重新加载 我不能return false 成功提交注册表 在你的html中
  • 当 Svelte 重用父 dom 元素时如何确保仅本地转换

    在 Svelte 中 我有一个组件用于显示两个不同列表中的项目 当这些项目从一个列表移动到另一个列表时 它们使用过渡来动画进入或退出 不过 我还有一种方法可以过滤屏幕上显示的内容 显示一组新的项目将使用相同的组件 但具有不同的数据 在这种情
  • 在 ASMX 中测试自定义 SOAP 标头

    ASMX生成的测试表单对于测试操作来说非常方便 然而 没有明显的方法来包含 SOAP 标头 如何在不编写客户端程序来使用该服务的情况下测试标头 如果您关心互操作性 请不要使用 net 客户端应用程序来测试 net Web 服务 使用 SOA
  • asp.net-mvc 在后期操作中获取字典或如何将 FormCollection 转换为字典

    任何人都知道如何改变FormCollection into a IDictionary或者如何获得IDictionary在后期行动中 这只是 Omnu 代码的等价物 但对我来说似乎更优雅 Dictionary
  • 如何重新加载当前状态?

    我正在使用 Angular UI Router 并且想要重新加载当前状态并刷新所有数据 重新运行当前状态及其父级的控制器 我有 3 个州级别 目录 组织 详细信息 目录 组织包含一个包含组织列表的表 单击表中的项目加载目录 组织 详细信息使
  • Cordova - 如何不出现闪屏?

    我不希望我的 Cordova 项目 Android 和 iOS 出现启动屏幕 如何删除它 我尝试禁用启动画面插件 但它仍然出现 怎么解决
  • 安装Oracle表单并出现错误。无法启动安装程序 (555)

    甲骨文形式下载地址 http www oracle com technetwork developer tools forms downloads index html http www oracle com technetwork dev
  • Json.Net布尔解析问题

    JObject Parse jsonString 导致布尔数据出现问题 例如json 是 BoolParam true 我用下面的代码来解析 JObject data JObject Parse str1 foreach var x in
  • Python 拼凑将 UCS-2 (UTF-16?) 读取为 ASCII

    我对这个问题有点不知所措 所以请提前原谅我的术语 我在 Windows XP 上使用 Python 2 7 运行它 我发现一些 Python 代码可以读取日志文件 执行一些操作 然后显示一些内容 什么 这还不够详细吗 好的 这是一个简化版本