Python:使用open和read函数

时间:2015-08-02 02:06:44

标签: python python-2.7

我正在阅读艰难学习Python 一书中的练习。在下面的代码示例中,我打开,截断然后写入文件。当我尝试使用try { mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mMediaRecorder.setOutputFile(folder + "/XXX" + ".mp4"); mMediaRecorder.prepare(); Log.d(TAG,"MediaRecorder Get Prepared"); } catch (IllegalStateException e) { // TODO Auto-generated catch block Log.d("timer","Prepare Failed"+e); releaseAudioMediaRecorder(); return false; } catch (IOException e) { // TODO Auto-generated catch block Log.d("timer", "Prepare Failed" + e); //e.printStackTrace(); releaseAudioMediaRecorder(); return false; } Below are the err messages I received on logcat and the exception I caputred when I call MediaRecorder.start(): E/MediaRecorder﹕ start failed: -2147483648 W/System.err﹕ java.lang.RuntimeException: start failed. W/System.err﹕ at android.media.MediaRecorder.start(Native Method) W/System.err﹕ at .AudioRecorder.StartRecordAudio(AudioRecorder.java:67) 而没有其他重复的print target.read()语句时,我收到一条错误消息,指出它无法列出我正在处理的脚本的内容,因为它没有打开。

我想知道如果我先前使用target = open(filename)语句打开文件,为什么需要重复的target = open(filename)语句。

target = open(filename, 'w')

2 个答案:

答案 0 :(得分:3)

EDIT 1添加了有关文件指针操作的更多信息。

您使用的'w'模式是只写的。

要打开文件进行读/写访问,可以使用file mode'r +'或'rb +',但即使这样做,您仍然必须将文件指针倒回到开头写入后使用seek来读取它的文件。

f = open('filename', 'rb+')

该文件具有关联的文件指针(在程序的内存中,而不在文件本身中),用于定义下一个文件操作的位置。如果你不小心,你可以轻松覆盖你不想要的部分文件。

要找出当前指针的内容,可以使用文件的tell方法:

print(f.tell())

要更改当前文件指针,可以使用seek方法:

f.seek(0)

seek方法有一个可选的第二个参数,可让您相对于文件末尾或相对于当前文件指针进行搜索。默认情况下,它寻求绝对位置。如果你想从文件中读取一些东西然后附加到它,那么寻找文件的末尾是很有用的:

f.seek(0, 2)  # Seeks past everything in the file

如果您只想附加到文件而不先读取任何内容,可以在追加模式('a'或'ab')中打开它。这将打开文件并寻求结束并准备好写作。使用除append之外的任何其他模式将在您打开文件时自动搜索文件的开头。

如果您已在文本模式下打开文件('r +'而不是'rb +'),则只能搜索文件的开头。 (文本模式用于在输入时支持来自不同操作系统的行结尾。意见各不相同,但我认为它比它的价值更麻烦,因为它隐藏了正在发生的事情,并且它非常容易处理纯Python代码的不同行结尾。)

答案 1 :(得分:3)

这是一个糟糕的代码,因为它教会你各种各样的坏习惯,并且已经过时了。处理文件对象时,请使用with语句和上下文管理器:

with open(filename, "w") as target:
    print "Truncating the file.  Goodbye!"
    target.truncate()

    print "Now I'm going to ask you for three lines."

    line1 = raw_input("line 1: ")
    line2 = raw_input("line 2: ")
    line3 = raw_input("line 3: ")

    target.write(line1, "\n", line2, "\n", line3)

# now we're out of the `with` block, and `target` has 
# been closed (and saved) automatically

# next block
with open(filename) as target:
    print target.read()

# and we're outside the block again, and `target` has
# been closed again, without having to call `.close()`
# explicitly. Isn't that easier to understand?

当您退出with块时,文件对象会自动关闭(写入它们的任何输出都会刷新到磁盘并在关闭之前保存)。

在原始代码中,target.close()之后未调用.write(),但在具有相同文件处理程序名称的同一文件上再次调用open()具有相同的效果。这不是直观的,也是Python的Zen(在您的Python解释器中输入import this)声明“ Explicit比隐式更好。”的原因之一。虽然文件闭包隐含在{ {1}}阻止,该块的定义表示文件在结束时将被关闭。