[英]Why does python output to a file like this?
嘗試讓用戶輸入名稱,然后將該變量復制到文件中,然后再讀回。 但是,回讀時只說[] []
我的代碼如下所示(當前)
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,' format ':1,'runit':1,'remove_selection':1,1,' str ':1,' _file_line_helper':1,'_asktabwidth':1,'_filename_to_unicode':1,'open_stack_viewer':1,'get_region':1,'cut':1,'open_module':1,'showerror':1,' class ' :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,'close':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,'_build_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,'center':1,'writelines':1,'recall':1,'load_extensions':1,'showprompt':1,'close_event':1,'reindent_to':1,1,'as kinteger':1,'' hash ':1,'RemoveKeybindings':1,'dedent_region_event':1,'linefeed_callback':1,' is_char_in_string ':1,'getattribute':1,1,'move_at_edge_if_selection':1,'開始執行: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,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”
知道為什么嗎?
首先,您已經以可讀寫模式“ r +”打開了文件。 這不會清空文件,並且您編寫的任何內容都將覆蓋現有字節。 幾乎可以肯定這不是您想要的:如果要附加到文件,則為'a',如果要先刪除文件(如果已存在),則為'w'。
其次,您將從停止寫入的位置開始讀取,而不是重新定位文件光標。 實際上,這還比這稍差一點:如果不在讀寫之間尋找文件對象的行為,則無法很好地定義文件對象的行為。
對於同時允許讀取和寫入(或附加)(包括“ +”號的模式)的模式,應在兩次讀取操作之間進行刷新(fflush)或重新定位(fseek,fsetpos,rewind)流,然后再進行寫入操作或寫入操作,然后進行讀取操作。
Python參考清楚表明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
語句在這里很好,因為一旦寫入完成,它將自動關閉文件。 通過關閉文件並在讀取模式下重新打開它,可以確保書面文本將其放入文件中並且不會被緩存。
至於為什么您什么也得不到,那可能是因為您必須首先尋找起點:
fo.seek(0)
result = fo.read()
有一個指針標記文件中的“當前”位置。 當您打開文件時,該文件將設置在文件的開頭。 接下來要做的就是寫它。 在編寫時,指針不斷前進。 完全編寫完之后,指針將位於文件的末尾。 然后,如果您開始閱讀(這就是您在這里所做的事情),那么您只會得到垃圾。 因此,您需要在開始讀取之前將指針重置為開始,這可以通過如上所見的查找來完成,或者可以在寫入后關閉文件,然后在讀取之前再次打開它。
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()
也是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.