还是关于python文件操作

时间:2012-07-02 14:58:17

标签: python file-io

我正在使用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,那就没问题。

1 个答案:

答案 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()操作将在下一次写入时撤消。