I was just messing around with reading and writing to textfiles in python, when something strange occured. When I ran
f = open('test.txt', 'w+')
f.write('hello')
print f.read()
Instead of the expected hello, the output was:
hellodف('test.txt', 'w+')
f.write('hello')
print f.read()
)
i LOGNAMEt USERt LNAMEt USERNAMEi ( R9 R: R; R< ( R t environt gett pwdt getpwuidt getuid( R t namet userR? ( ( s E:\Python\lib\getpass.pyR ̀ s
( t AskPassword( t __doc__R R R3 t __all__t UserWarningR R R( R1 R R R R R R t ImportErrorR R+ t EasyDialogsRD R ( ( ( s E:\Python\lib\getpass.pyt <module> s, $?
sued when getpass() cannot prevent
echoing of the password contents while reading.
On Windows, the msvcrt module will be used.
On the Mac EasyDialogs.AskPassword is used, if available.
i getpasst getusert GetPassWarningc B s e Z RS( ( t __name__t
__module__( ( ( s E:\Python\lib\getpass.pyR s s
Password: c
C ś d } d } yJ t j d t j t j B } t j | d d à } | } | sU | } n Wnj t k
r} y t j j À } Wn& t
t f k
rÀt | | Â } n Xt j } | sÀt j
} qÀn X| d k rہd } yÀt j | Á } | } | d c t j M<t j } t t d  r*| t j O} n z, t j | | | à t | | d | Â} Wd t j | | | à | j À XWqہt j k
rׁ} | d k r߁ n ~ ~ t | | Â } qہXn | j d Á | S( s Prompt for a password, with echo turned off.
Args:
prompt: Written on stream to ask for the input. Default: 'Password: '
stream: A writable file object to display the prompt. Defaults to
the tty. If no tty is available defaults to sys.stderr.
Returns:
The seKr3t input.
Raises:
EOFError: If our input tty or stdin was closed.
GetPassWarning: When we were unable to turn echo off on the input.
Always restores terminal settings before returning.
s /dev/ttys w+i i t TCSASOFTt inputNs
( t Nonet ost opent O_RDWRt O_NOCTTYt fdopent EnvironmentErrort syst stdint filenot AttributeErrort
ValueErrort fallback_getpasst stderrt termiost tcgetattrt ECHOt TCSAFLUSHt hasattrR t tcsetattrt
_raw_inputt flusht errort write(
t promptt streamt fdt ttyR t et passwdt oldt newt tcsetattr_flags( ( s E:\Python\lib\getpass.pyt unix_getpass sJ
c C sӀ t j t j k r t | | Â Sd d l } x | D] } | j | Á q2 Wd } xc | j À } | d k sv | d k rz Pn | d k rπt n | d k rȀ| d } qR | | } qR | j d Á | j d Á | S( s9 Prompt for password with echo off, using Windows getch().i s
s
s s ( R R t __stdin__R t msvcrtt putcht getcht KeyboardInterrupt( R R R+ t ct pw( ( s E:\Python\lib\getpass.pyt win_getpassY s$
c C s? t j d t d d Â| s( t j } n | d IJt | | Â S( Ns% Can not control echo on the terminal.t
stackleveli s& Warning: Password input may be echoed.( t warningst warnR R R R ( R R ( ( s E:\Python\lib\getpass.pyR p s
R) c C s̀ | s t j } n | s$ t j } n t | Á } | rP | j | Á | j À n | j À } | sk t n | d d k rȀ| d } n | S( Niﳁ
( R R R t strR R t readlinet EOFError( R R R t line( ( s E:\Python\lib\getpass.pyR y s
c C s\ d d l } x* d D]" } | j j | Á } | r | Sq Wd d l } | j | j À Á d S( s Get the username from the environment or password database.
First try various environment variables, then the password
dat
I know that I should do
with open('test.txt', 'w') as f:
f.write('hello')
with open('test.txt', 'r') as f:
print f.read()
and this gives indeed the expected hello, but why isn’t this happening in the first case, and what is the getpass.py module doing there?
I am running windows 7 with python 2.7.3
This is caused by the fact that when you write you advance the file pointer ahead the number of bytes written to the file and when you do the read you are reading past this point until a
eofis found. I cannot exactly state why you are reading in what appears to be another file though but the following should fix the error.The above will produce what I believe is your expected output.
As for the error I can make a guess as to what is happening. The file object created by
openis still in memory and the buffer is also in the same memory, which is contained inside of the python interpreter which the first parts of the output look like some of the string values contained in python help files and in the binary itself.This behavior does not make any sense though.