问题标签 [python-2.x]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 返回 unicode 字符串的前 N 个字符
我有一个 unicode 字符串,我需要返回前 N 个字符。我正在这样做:
但当然是 unicode 字符串的长度!= 字符的长度。有任何想法吗?唯一的解决方案是使用 re?
编辑:更多信息
返回->?
我认为 unicode 字符串是两个字节(char),这就是发生这种情况的原因。如果我做:
我明白了
M
这是正确的,那么,我应该总是切片 *2 还是应该转换成什么?
python - 将元类与多重继承结合使用的 TypeErrors
我有两个关于元类和多重继承的问题。第一个是:为什么我得到一个 TypeError 的类Derived
而不是Derived2
?
确切的错误信息是:
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution order (MRO) for bases object, Klass
第二个问题是:为什么super
在这种情况下不起作用(如果我使用__init__
而不是__new__
,则super
再次起作用):
我得到:
TypeError: Error when calling the metaclass bases type.__new__(X):
X is not a type object (str)
我正在使用 Python 2.6。
python - 在内存中加载大字典的巨大内存使用
我在磁盘上有一个只有 168MB 的文件。它只是一个逗号分隔的单词,id 列表。单词长度可以是 1-5 个字符。有 650 万行。
我在 python 中创建了一个字典来将其加载到内存中,这样我就可以根据该单词列表搜索传入的文本。当 python 将其加载到内存中时,它显示已使用 1.3 GB 的 RAM 空间。知道为什么吗?
所以假设我的word文件看起来像这样......
然后再加上 650 万。然后我遍历该文件并创建一个字典(python 2.6.1):
只是这样做会炸毁内存。我查看活动监视器,它将内存与所有可用的内存挂钩,最高可达 1.5GB 左右的 RAM 在我的笔记本电脑上,它刚刚开始交换。任何想法如何使用 python 最有效地将键/值对存储在内存中?
更新:我尝试使用 anydb 模块,在 440 万条记录之后它就死了,浮点数是我尝试加载它以来经过的秒数
你可以看到它运行得很好。每隔几秒插入 200,000 行,直到我撞到墙,时间翻了一番。
python - 覆盖自定义类的 bool()
我想要的只是让 bool(myInstance) 返回 False(并且让 myInstance 在 if/or/and 等条件下评估为 False。我知道如何覆盖 >、<、=)
我试过这个:
有什么建议么?
(我使用的是 Python 2.6)
python - 在 Python 中列出最小值,但没有?
是否有任何聪明的内置函数或将返回1
以下min()
示例的内容?(我敢打赌它不返回任何东西是有充分理由的,但在我的特殊情况下,我需要它来忽略None
非常糟糕的值!)
python - 如何防止我的 Python 应用程序在到达代码末尾时自动关闭?
我是编程新手,尤其是 Python。我正在尝试制作一个将华氏温度转换为摄氏温度的应用程序,但我不知道如何使程序保持打开状态。每当它到达代码的末尾时,它会在用户看到他或她的结果之前自动关闭。我正在使用 Python 2.6。
python - 隐式调用父类初始化器
在上面的代码中,注释掉的__init__
调用似乎是进行超类初始化的普遍接受的“智能”方式。但是,如果类层次结构可能发生变化,我一直在使用未注释的形式,直到最近。
似乎在调用B
上述层次结构中的超级构造函数时,B.__init__
再次调用self.__class__
它实际上是C
,而不是B
我一直假设的那样。
Python-2.x 中是否有某种方法可以在调用超级构造函数而不命名当前类(B
in in )时维护正确的 MRO(关于以正确的顺序初始化所有父类super(B, self).__init__(1, b, c)
)?
python - 判断 Python 是否处于交互模式
在 Python 脚本中,有没有办法判断解释器是否处于交互模式?这很有用,例如,当您运行交互式 Python 会话并导入模块时,会执行稍微不同的代码(例如,关闭日志记录)。
我已经查看了tell python是否处于-i模式并尝试了那里的代码,但是,该函数仅在使用-i标志调用Python时才返回true,而不是在用于调用交互模式的命令python
没有参数时返回.
我的意思是这样的:
python - 为什么在 Python 2 中 '' > 0 True?
在 Python 2.x 中:
这是为什么?
python - SQLite、python、unicode 和非 utf 数据
我首先尝试使用 python 在 sqlite 中存储字符串,并得到消息:
sqlite3.ProgrammingError:除非您使用可以解释 8 位字节串的 text_factory(如 text_factory = str),否则不得使用 8 位字节串。强烈建议您将应用程序切换为 Unicode 字符串。
好的,我切换到 Unicode 字符串。然后我开始收到消息:
sqlite3.OperationalError:无法解码为带有文本“Sigur Rós”的 UTF-8 列“tag_artist”
尝试从数据库中检索数据时。更多研究,我开始用 utf8 对其进行编码,但随后“Sigur Rós”开始看起来像“Sigur Rós”
注意: 正如@John Machin 指出的那样,我的控制台设置为显示在“latin_1”中。
是什么赋予了?在阅读完这篇文章后,描述了与我完全相同的情况,似乎建议是忽略其他建议并毕竟使用 8 位字节串。
在我开始这个过程之前,我对 unicode 和 utf 了解不多。在过去的几个小时里我学到了很多东西,但我仍然不知道是否有一种方法可以正确地将 'ó' 从 latin-1 转换为 utf-8 而不会破坏它。如果没有,为什么 sqlite 会“强烈推荐”我将应用程序切换到 unicode 字符串?
我将用我在过去 24 小时内学到的所有内容的摘要和一些示例代码来更新这个问题,这样我鞋子里的人就可以得到一个简单的(呃)指南。如果我发布的信息有任何错误或误导性,请告诉我,我会更新,或者你们中的一位资深人士可以更新。
答案摘要
让我首先陈述我所理解的目标。如果您尝试在它们之间进行转换,处理各种编码的目标是了解您的源编码是什么,然后使用该源编码将其转换为 unicode,然后将其转换为您想要的编码。Unicode 是一个基础,编码是该基础的子集的映射。utf_8 为 unicode 中的每个字符都留有空间,但由于它们与 latin_1 不在同一个位置,因此以 utf_8 编码并发送到 latin_1 控制台的字符串看起来不会像您期望的那样。在 python 中,获取 unicode 并进入另一种编码的过程如下所示:
或者如果 str 已经是 unicode
对于 sqlite,我实际上并不想再次对其进行编码,我想对其进行解码并将其保留为 unicode 格式。当您尝试在 python 中使用 unicode 和编码时,您可能需要注意以下四件事。
- 您要使用的字符串的编码,以及您要使用的编码。
- 系统编码。
- 控制台编码。
- 源文件的编码
阐述:
(1) 当你从一个源中读取一个字符串时,它必须有一些编码,比如 latin_1 或 utf_8。就我而言,我从文件名中获取字符串,所以不幸的是,我可能会得到任何类型的编码。Windows XP 使用 UCS-2(一个 Unicode 系统)作为其原生字符串类型,这对我来说似乎是在欺骗。对我来说幸运的是,大多数文件名中的字符不会由一种以上的源编码类型组成,我认为我的所有字符要么完全是 latin_1,完全是 utf_8,要么只是纯 ascii(这是两者的子集那些)。所以我只是阅读它们并对其进行解码,就好像它们仍在 latin_1 或 utf_8 中一样。但是,您可以将 latin_1 和 utf_8 以及任何其他字符混合在 Windows 上的文件名中。有时这些字符可以显示为框,其他时候他们只是看起来被破坏了,而其他时候他们看起来是正确的(重音字符等等)。继续。
(2) Python 有一个默认的系统编码,它在 python 启动时设置,并且在运行时不能更改。有关详细信息,请参见此处。肮脏的摘要......这是我添加的文件:
当您使用没有任何其他编码参数的 unicode("str") 函数时,会使用此系统编码。换一种说法,python 尝试根据默认的系统编码将“str”解码为 unicode。
(3) 如果你使用的是 IDLE 或者命令行 python,我认为你的控制台会按照默认的系统编码显示。由于某种原因,我在 Eclipse 中使用 pydev,所以我必须进入我的项目设置,编辑我的测试脚本的启动配置属性,转到 Common 选项卡,然后将控制台从 latin-1 更改为 utf-8 以便我可以直观地确认我正在做的事情是有效的。
(4) 如果你想有一些测试字符串,例如
在您的源代码中,那么您将不得不告诉 python 您在该文件中使用哪种编码。(仅供参考:当我输入错误的编码时,我不得不按 ctrl-Z,因为我的文件变得不可读。)这很容易通过在源代码文件的顶部放置这样的一行来完成:
如果您没有这些信息,python 默认会尝试将您的代码解析为 ascii,因此:
一旦你的程序正常工作,或者,如果你不使用 python 的控制台或任何其他控制台来查看输出,那么你可能真的只关心列表中的#1。除非您需要查看输出和/或您使用内置的 unicode() 函数(没有任何编码参数)而不是 string.decode() 函数,否则系统默认和控制台编码并不那么重要。我写了一个演示函数,我将粘贴到这个巨大的混乱的底部,我希望正确地演示我列表中的项目。这是我通过演示函数运行字符“ó”时的一些输出,显示了各种方法如何对作为输入的字符做出反应。这次运行我的系统编码和控制台输出都设置为 utf_8:
现在我将系统和控制台编码更改为 latin_1,我得到相同输入的输出:
请注意,“原始”字符显示正确,并且内置 unicode() 函数现在可以正常工作。
现在我将控制台输出改回 utf_8。
在这里一切仍然与上次一样,但控制台无法正确显示输出。等等。下面的函数还显示了更多信息,希望能帮助人们找出他们理解的差距在哪里。我知道所有这些信息都在其他地方,并且在那里得到了更彻底的处理,但我希望这对于尝试使用 python 和/或 sqlite 进行编码的人来说是一个很好的起点。想法很棒,但有时源代码可以为您节省一两天的时间来弄清楚哪些功能做什么。
免责声明:我不是编码专家,我把这些放在一起是为了帮助我自己理解。当我可能应该开始将函数作为参数传递以避免如此多的冗余代码时,我继续构建它,所以如果可以的话,我会让它更简洁。此外,utf_8 和 latin_1 绝不是唯一的编码方案,它们只是我正在玩的两个,因为我认为它们可以处理我需要的一切。将您自己的编码方案添加到演示函数并测试您自己的输入。
还有一件事:显然有疯狂的应用程序开发人员让 Windows 的生活变得困难。
非常感谢下面的答案,特别是@John Machin 的彻底回答。