为什么python输出到这样的文件?

时间:2011-12-24 11:16:08

标签: python windows python-2.7

尝试让用户输入其名称,将该变量复制到文件中,然后将其读回。但是,当回读时,它只会说[] []

我的代码看起来像这样(当前)

Name = raw_input("What is your Name? ")
print "you entered ", Name
fo = open("foo.txt", "r+")
fo.write (Name)
str = fo.read();
print "Read String is : ", str
fo.close()

当我查看foo.txt文件时,它内置了所有这些内容:

Mathew“ÿÿÿÿ_getresponse:16:线程醒来:回复:('OK',{'maybesave':1,'格式':1,'runit':1,'remove_selection' :1,' str ':1,'_ file_line_helper':1,'_ pubtabwidth':1,'_ filename_to_unicode':1,'open_stack_viewer':1,'get_region':1,'cut': 1,'open_module':1,'showerror':1,'':1,'smart_indent_event':1,'set_status_bar':1,'about_dialog':1,'indent_region_event':1 ,'load_extension':1,'set_region':1,'_ close':1,'cancel_callback':1,'postwindowsmenu':1,' subclasshook ':1,'newline_and_indent_event':1, 'toggle_debugger':1,'saved_change_hook':1,'eof_callback':1,'get_warning_stream':1,'get_standard_extension_names':1,'guess_indent':1,'resetFont':1,'center_insert_event':1,'replace_event ':1,'unload_extensions':1,'del_word_right':1,'close_debugger':1,' EditorWindow _extra_help_callback':1,'python_docs':1,'fill_menus':1,'flush ':1,'关闭':1, ' setattr ':1,'set_notabs_indentwidth':1,'help_dialog':1,'set_saved':1,'get_selection_indices':1,'open_debugger':1,'tabify_region_event':1,' comment_region_event':1,'get_var_obj':1,'find_selection_event':1,'_ rmcolorizer':1,'goto_line_event':1,'load_standard_extensions':1,'reset_undo':1,'long_title':1,'paste' :1,'close2':1,'reset_help_menu_entries':1,'set_indentation_params':1,'open_class_browser':1,'endexecuting':1,' delattr ':1,'_ addcolorizer': 1,' repr ':1,'close_hook':1,'home_callback':1,'right_menu_event':1,'getlineno':1,'apply_bindings':1,'restart_shell':1 ,'_ make_blanks':1,'get_geometry':1,'ApplyKeybindings':1,'get_tabwidth':1,'ResetColorizer':1,'open_path_browser':1,'filename_change_hook':1,'_ built_char_in_string_func':1,' isatty':1,'find_event':1,'untabify_region_event':1,' reduce ':1,'find_in_files_event':1,'new_callback':1,'getvar':1 ,'copy':1,'writelines':1,'召回':1,'load_extensions':1,'showprompt':1,'close_event':1,'reindent_to':1,' askinteger':1,'哈希':1,'RemoveKeybindings':1,'dedent_region_event':1,'linefeed_callback':1,'is_char_in_string':1,' getattribute ':1,'move_at_edge_if_selection':1,'beginexecuting':1,'enter_callback':1,'short_title':1,'getwindowlines':1,'smart_backspace_event':1,' sizeof ':1,'set_tabwidth':1,'find_again_event':1,' init ':1,'del_word_left':1,'get_saved':1,' reduce_ex ':1,' new ':1,'select_all':1,'gotoline':1,'view_restart_mark':1,'change_indentwidth_event':1,'write':1,'set_debugger_indicator' :1,'config_dialog':1,'set_warning_stream':1,'setvar':1,'createmenubar':1,'begin':1,'toggle_tabs_event':1,'askyesno':1,'ispythonsource':1 ,'resetoutput':1,'set_close_hook':1,'goto_file_line':1,'readline':1, 'toggle_jit_stack_viewer':1,'make_rmenu':1,' EditorWindow _recent_file_callback':1,'uncomment_region_event':1,'update_recent_files_list':1,'set_line_and_column':1})ãèã“po” èã“po”

知道为什么吗?

3 个答案:

答案 0 :(得分:5)

首先,您已经在模式" r +"中打开了文件。这是读写的。这不会清空文件,您编写的任何内容都将覆盖现有字节。这几乎肯定不是你想要的:要么' a'如果你想附加到文件,或者' w'如果你想先删除文件,如果它已经存在。

其次,您从写入停止的位置开始读取,而不是重新定位文件光标。实际上它比这稍微差一点:如果你不在读写之间寻找,文件对象的行为就没有很好地定义。

来自C reference for fopen

  

对于允许读写(或附加)的模式   (包含" +"符号的那些),应该刷新流   (fflush)或在a之间重新定位(fseek,fsetpos,rewind)   阅读操作后写作操作或写作   操作后进行阅读操作。

Python reference表明open()是使用标准C文件对象实现的。

这是我要写的内容:

with open('foo.txt', 'w') as f:
    f.write(name)
with open('foo.txt', 'r') as f:
    print 'Text is:', f.read()

with语句在这里很好,因为它在写完成后会自动关闭文件。通过关闭文件并在读取模式下重新打开它,可以保证书面文本成为文件并且不会被缓存。

答案 1 :(得分:0)

至于为什么你什么也得不回来,这可能是因为你必须首先寻求开始:

fo.seek(0)
result = fo.read()

答案 2 :(得分:0)

有一个指针标记文件中的“当前”位置。打开文件时,它将设置在文件的开头。你接下来要做的就是写信给它。在你写的时候,指针一直在前进。完全写入后,指针位于文件的末尾。如果你开始阅读(这就是你在这里做的),你只会得到垃圾。因此,您需要在开始阅读之前将指针重置为开头,这可以通过上面看到的搜索来完成,或者您可以在写入后关闭文件并在阅读之前再次打开它。

Name = raw_input("What is your Name? ")
print "you entered ", Name
fo = open("foo.txt", "r+")
fo.write (Name)
fo.flush()
fo.close()
fo = open("foo.txt", "r+")
str = fo.read();
print "Read String is : ", str
fo.close()

在写入文件后调用flush()也是个好主意。