1

我正在使用 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,就可以了。

4

1 回答 1

1

Python 的行为tell()与 C 相同ftell()。这里的文档说明:

请注意,当打开文件以追加数据时,当前文件位置由最后一次 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() 操作都将在下一次写入时撤消。

于 2012-07-02T15:36:38.433 回答