我正在阅读艰难学习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')
答案 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}}阻止,该块的定义表示文件在结束时将被关闭。