在模块上运行2to3.py后仍然存在错误

时间:2013-12-05 22:55:50

标签: python python-3.x stringio python-2to3

我使用2to3.py脚本将我的几个文件转换为Python 3。我相信我需要运行所有修复程序,所以我的命令包括

  

-f all -f buffer -f idioms -f set_literal -f ws_comma -w

我尝试使用Python 3运行转换后的代码,但出现错误

  

[Errno 22]参数无效

就行了

stream.seek(-2,1)

stream是一个用于解析文件的StringIO对象。这是Python 2和3中的已知差异,那么我应该使用不同的方法/语法吗?或者是2to3转换中的问题 - 也许我没有正确运行该工具。 (我的意思是尽可能多地运行固定器)

1 个答案:

答案 0 :(得分:3)

我不确定,但我猜这是3.x中新的Unicode处理的牺牲品:

In [3]: file_ = open('/etc/services', 'r')

In [4]: file_.readline()
Out[4]: '# Network services, Internet style\n'

In [5]: file_.readline()
Out[5]: '#\n'

In [6]: file_.readline()
Out[6]: '# Note that it is presently the policy of IANA to assign a single well-known\n'

In [7]: file_.seek(-2, 1)
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-7-6122ef700637> in <module>()
----> 1 file_.seek(-2, 1)

UnsupportedOperation: can't do nonzero cur-relative seeks

但是,您可以使用二进制I / O执行此操作:

In [9]: file_ = open('/etc/services', 'rb')

In [10]: file_.readline()
Out[10]: b'# Network services, Internet style\n'

In [11]: file_.readline()
Out[11]: b'#\n'

In [12]: file_.readline()
Out[12]: b'# Note that it is presently the policy of IANA to assign a single well-known\n'

In [13]: file_.seek(-2, 1)
Out[13]: 112
BTW,如果你想维持双代码库一段时间,3to2比2to3更有效。此外,很多人(包括我)都很幸运,维护一个运行在2.x和3.x上的代码库,而不是使用2to3或3to2。

这是我给出的关于编写在2.x和3.x上运行的代码的演示文稿的链接: http://stromberg.dnsalias.org/~dstromberg/Intro-to-Python/

PS:类似于StringIO,是BytesIO:

In [17]: file_ = io.BytesIO(b'abc def\nghi jkl\nmno pqr\n')

In [18]: file_.readline()
Out[18]: b'abc def\n'

In [19]: file_.seek(-2, 1)
Out[19]: 6