簡體   English   中英

為什么python輸出到這樣的文件?

[英]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'。

其次,您將從停止寫入的位置開始讀取,而不是重新定位文件光標。 實際上,這還比這稍差一點:如果不在讀寫之間尋找文件對象的行為,則無法很好地定義文件對象的行為。

C參考fopen

對於同時允許讀取和寫入(或附加)(包括“ +”號的模式)的模式,應在兩次讀取操作之間進行刷新(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM