所以我只是注意到了这一点,经过一些实验,我设法让它变得可重复.我没有看到这张贴在任何地方.在某些情况下,Python似乎正在读取文件的末尾.
我正在使用Python 2.7.12
f = open('test', 'wb')
f.write('this is a test')
f.close()
Run Code Online (Sandbox Code Playgroud)
现在,"test"是一个14字节的文件,文本"这是一个测试".
f = open('test', 'rb+')
f.write('abcd')
x = f.read(1024*1024)
f.close()
Run Code Online (Sandbox Code Playgroud)
现在"test"是一个4110字节的文件,有这种内容http://i.imgur.com/rWgNWXy.png
这是一个错误吗?这是安全隐患吗?
我的目标是从文件中读取行,删除它末尾的空格并写回同一个文件.我试过以下代码:
with open(filename, 'r+') as f:
for i in f:
f.write(i.rstrip()+"\n")
Run Code Online (Sandbox Code Playgroud)
这似乎写在文件的末尾,保持文件中的初始数据不变.我知道使用f.seek(0)将指针返回到文件的开头,我假设这个解决方案需要某种方式.
你能否告诉我是否有不同的方法,或者我是否在正确的补丁上只需要在代码中添加更多逻辑?
似乎在 Windows 中使用(或)权限打开的文件上write()紧跟 a不会更新文件。read()r+r+b
假设testfile.txt当前目录中有一个文件,内容如下:
This is a test file.
Run Code Online (Sandbox Code Playgroud)
我执行以下代码:
with open("testfile.txt", "r+b") as fd:
print fd.read(4)
fd.write("----")
Run Code Online (Sandbox Code Playgroud)
我希望代码打印This并将文件内容更新为:
This----a test file.
Run Code Online (Sandbox Code Playgroud)
这至少在 Linux 上运行良好。但是,当我在 Windows 上运行它时,消息会正确显示,但文件没有改变 - 就像write()被忽略了一样。如果我调用tell()文件句柄,它会显示位置已更新(4在之前write()和8之后),但文件没有更改。
但是,如果我fd.seek(4)在该write()行之前放置一个明确的内容,那么一切都会按我的预期进行。
有人知道 Windows 下这种行为的原因吗?
作为参考,我在带有 NTFS 分区的 Windows 7 上使用 Python 2.7.3。
编辑
在回应的意见,我都尝试r+b和rb+-的官方Python文档似乎意味着前者是规范的。
我fd.flush()在不同的地方打电话,并在read()和之间放置一个write()这样的: …
我有一个~2亿行,7列csv文件.我需要删除行2636759.这个文件是7.7GB,超过内存容量.我对R最熟悉,但也可以在python或bash中做到这一点.
我无法在一次操作中读取或写入此文件.在磁盘上以增量方式构建此文件的最佳方法是什么,而不是尝试在内存中执行此操作?
我试图在SO上找到它,但只能找到如何使用足够小的文件来读取/写入内存,或者使用位于文件开头的行.
这是python(3.4)代码:
test = open('test.txt', 'r+')
test.truncate();
i = 0
stop = 99
while i <= stop:
test.write("{:0>{}}|".format(i, len(str(stop))))
i += 1
print(test.read())
Run Code Online (Sandbox Code Playgroud)
它写的文件很好,但由于某种原因它不会打印它.
test = open('test.txt', 'r+')
print(test.read())
Run Code Online (Sandbox Code Playgroud)
这按预期打印,所以我不知道问题出在哪里.
更新:
使用seek(0)解决了它.你可以链接一下它的解释吗?我在语言的文档中找不到它.