Почему Python выводит в файл, как это? - PullRequest
0 голосов
/ 24 декабря 2011

Пытаясь заставить пользователя ввести свое имя, скопировать эту переменную в файл и затем прочитать его обратно.Однако при обратном чтении он говорит только [] []

Мой код выглядит так (в настоящее время)

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, он имеет всеэто внутри:

Мэтью »ÿÿÿÿ _вопрос: 16: поток проснулся: ответ: ('OK', {'maybesave': 1, ' format ': 1, 'runit':1, 'remove_selection': 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, 'save_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,' уменьшите ': 1,' find_in_files_event ': 1,' new_callback ': 1,' getvar ': 1,' copy ': 1, «center»: 1, «writelines»: 1, «revall»: 1, «load_extensions»: 1, «showprompt»: 1, «close_event»: 1, «reindent_to»: 1, «askinteger»: 1, ' hash ': 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, ' redu_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 ]

5 голосов
/ 24 декабря 2011

Сначала вы открыли файл в режиме «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, так как оно автоматически закрывает файл после завершения записи. Закрывая файл и открывая его снова в режиме чтения, вы гарантируете, что записанный текст попал в файл и не будет кэширован.

0 голосов
/ 24 декабря 2011

Есть указатель, который отмечает «текущую» позицию в файле.Когда вы открываете файл, он устанавливается в начале файла.Следующее, что вы делаете, это пишите.Когда вы пишете, указатель продолжает двигаться.Когда вы полностью написали, указатель находится в конце файла.И если вы начнете читать (то, что вы делаете здесь), вы получите только мусор.Таким образом, вам нужно сбросить указатель на начало, прежде чем вы начнете читать, что можно сделать поиском, как вы можете видеть выше, или вы можете закрыть файл после записи и открыть его снова перед чтением.Также рекомендуется позвонить flush() после записи в файл.

0 голосов
/ 24 декабря 2011

Что касается того, почему вы ничего не получаете назад, это, вероятно, потому, что вы должны искать сначала:

fo.seek(0)
result = fo.read()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...