我使用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转换中的问题 - 也许我没有正确运行该工具。 (我的意思是尽可能多地运行固定器)
答案 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