gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:11:04 25 4
gpt4 key购买 nike

我在这方面有点不知所措,所以请提前原谅我的术语。

我在 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

这个日志breaks

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

type ascii.log > scrubbed.log

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

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

我正在阅读 thisthis但我的眼睛仍然在他们的脑袋里转来转去,所以虽然这可能是我的长期策略,但我想知道是否有我可以使用的临时 hack。

最佳答案

codecs.open()将允许您使用特定编码打开文件,并且它将生成 unicode。您可以尝试一些,从最有可能到最不可能(或者该工具总是可以生成 UTF-16LE,但机会不大)。

此外,"Unicode In Python, Completely Demystified" .

关于Python kludge 将 UCS-2(UTF-16?)读取为 ASCII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5241909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com