我正在使用Windows 7和Python 2.7.3。
PS C:\Python27\LearnPythonTheHardWay> python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> input = open('file_operation_sample.txt', 'a+')
>>> print input.tell() # first 'tell()'
0
>>> input.write(u'add')
>>> print input.tell()
12
>>> input.seek(0)
>>> print input.read()
123456789add
>>> input.close()
>>>
我很困惑为什么第一个tell()
打印0
(我以为它会输出9
)? 'a +'是追加模式,文件指针应该在EOF。我更困惑的是,最后字符串'abc'附加到'123456789'?
另一个问题,
PS C:\Python27\LearnPythonTheHardWay> python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> from io import open
>>> input = open('file_operation_sample.txt', 'a+')
>>> print input.tell()
9
>>> input.write(u'add')
3L
>>> print input.tell()
12
>>> input.seek(2)
2
>>> input.seek(2, 1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: can't do nonzero cur-relative seeks
>>>
有什么问题?如果我发表评论from io import open
,那就没问题。
答案 0 :(得分:1)
Python tell()
的行为与C ftell()
的行为相同。 documentation here注释:
请注意,打开文件以附加数据时,当前文件位置由上一次I / O操作决定,而不是由下一次写入的位置确定。
这可以解释为什么你的第一个告诉是0
- 你还没有完成任何文件I / O.
这是一个例子。首先,我们将5个字符写入该文件。正如我们所期望的那样,写操作从0
开始,当我们完成时,文件指针位于5
。
>>> with open('test.txt', 'w') as fh:
fh.write('12345')
fh.tell()
5L
现在我们打开它进行追加。我们从您发现的0
开始。但是现在我们从文件中做了read()
而不是太令人惊讶,我们从0
开始阅读。读取后,文件指针已移至5
。
>>> with open('test.txt', 'a+') as fh:
fh.tell()
fh.read()
fh.tell()
0L
'12345'
5L
好的,让我们打开文件进行追加,这次写一下。正如文档所述,在写入之前,文件指针被移动到文件的末尾。所以我们在旧的字节之后得到新的字节,即使在写入之前文件指针是0
。
>>> with open('test.txt', 'a+') as fh:
fh.tell()
fh.write('abc')
fh.tell()
fh.seek(0)
fh.read()
0L
8L
'12345abc'
Python的seek()
文档也暗示了这种行为:
请注意,如果打开文件进行追加(模式'a'或'a +'),则任意 seek()操作将在下一次写入时撤消。