我有这个Python代码:
f = open("database.txt", "r+")
f.write("Hello!")
print f.read()
f.close()
当我运行代码时,Idle会向我显示:-t
但是当我看到database.txt
文件时,这里面是什么:
Hello!t stdouts #007700t stderrc C s | | _ d | _ d S( N( R4 R* t owin( R R4 ( ( s' C:\Python27\lib\idlelib\OutputWindow.pyR … s c C s0 | j s | j ƒ n | j j | | | ƒ d S( N( RP t setupR ( R R R R ( ( s' C:\Python27\lib\idlelib\OutputWindow.pyR ‰ s
c C sx t | j ƒ | _ } | j } x6 | j j ƒ D]% \ } } | r/ | j | | q/ q/ W| j d ƒ | j j | _ d S( Nt sel( R R4 RP R t tagdefst itemst
tag_configuret tag_raiseR ( R RP R t tagt cnf( ( s' C:\Python27\lib\idlelib\OutputWindow.pyRQ Ž s
( RG RH RS R R RQ ( ( ( s' C:\Python27\lib\idlelib\OutputWindow.pyRK } s ( ( t Tkintert idlelib.EditorWindowR R- R2 t idlelibR R RK ( ( ( s' C:\Python27\lib\idlelib\OutputWindow.pyt <module> s
vWindow.pyt short_title s c C s | j ƒ r d Sd Sd S( Nt yest no( t get_saved( R ( ( s' C:\Python27\lib\idlelib\OutputWindow.pyt maybesave s t insertc C ss t | t ƒ r< y t | t j ƒ } Wq< t k
r8 q< Xn | j j | | | ƒ | j j | ƒ | j j ƒ d S( N(
t
isinstancet strt unicodeR t encodingt UnicodeErrorR R t seet update( R t st tagst mark( ( s' C:\Python27\lib\idlelib\OutputWindow.pyt write% s
c C s" x | D] } | j | ƒ q Wd S( N( R ( R t linest line( ( s' C:\Python27\lib\idlelib\OutputWindow.pyt
writelines2 s
c C s d S( N( ( R ( ( s' C:\Python27\lib\idlelib\OutputWindow.pyt flush6 s t Cuts <<cut>>t rmenu_check_cutt Copys <<copy>>t rmenu_check_copyt Pastes <<paste>>t rmenu_check_pastes Go to file/lines <<goto-file-line>>s file "([^"]*)", line (\d+)s ([^\s]+)\((\d+)\)s ^(\s*\S.*?):\s*(\d+):s ([^\s]+):\s*(\d+):s ^\s*(\S.*?):\s*(\d+):c C sô | j d k rQ g } x- | j D]" } | j t j | t j ƒ ƒ q W| | _ n | j j d d ƒ } | j | ƒ } | sÅ | j j d d ƒ } | j | ƒ } | sÅ t
j d d d | j ƒd Sn | \ } } | j j
| ƒ } | j | ƒ d S( Ns insert linestarts insert lineends insert -1line linestarts insert -1line lineends No special linesT The line you point at doesn't look like a valid file name followed by a line number.t parent( t file_line_progst Nonet file_line_patst appendt ret compilet
IGNORECASER t gett _file_line_helpert tkMessageBoxt showerrort flistt opent gotoline( R t eventt lt patR t resultR
t linenot edit( ( s' C:\Python27\lib\idlelib\OutputWindow.pyR N s(
c C sª xz | j D]k } | j | ƒ } | r
| j d d ƒ \ } } y t | d ƒ } | j ƒ PWqu t k
rq q
qu Xq
q
Wd Sy | t | ƒ f SWn t k
r¥ d SXd S( Ni i t r( R) t searcht groupR5 t closet IOErrorR* t intt TypeError( R R t progt matchR
R; t f( ( s' C:\Python27\lib\idlelib\OutputWindow.pyR1 i s
( ( R" s <<cut>>R# ( R$ s <<copy>>R% ( R& s <<paste>>R' N( NNN( s Go to file/lines <<goto-file-line>>N( t __name__t
__module__t __doc__R R R
R R R R! R* t rmenu_specsR+ R) R R1 ( ( ( s' C:\Python27\lib\idlelib\OutputWindow.pyR s*
t OnDemandOutputWindowc B sE e Z i i d d 6d 6i d d 6d 6Z d „ Z d „ Z d „ Z RS( t bluet
fore
答案 0 :(得分:1)
试试这样:
with open("database.txt", "w") as f:
f.write("Hello!")
with open("database.txt", "r") as f:
for line in f:
print line
您无需使用with statement手动关闭文件。 另外,一旦你写完文件,你就会阅读这些文件。 通常,最好将对文件的读写访问权限分开。除非你真的需要这两个。
答案 1 :(得分:0)
如果你想写你的文件,然后阅读它,你应该:
以写入模式打开它(w)。这也会将文件截断为零长度。
f = open("database.txt", "w")
f.write("Hello!")
f.close
然后,以读取模式(r)打开它,它将您定位在文件的开头:
f = open("database.txt", "r")
print f.read()
f.close()
使用&#34; r +&#34;使您进入读/写模式,并且不会截断文件。所以,当你写信给它时,你的&#34;你好!&#34;字符串覆盖文件的开头,其余部分保持不变。
最好使用with
,例如:
with open("database.txt", "w") as f:
f.write("Hello!")
因此,您不必明确地关闭文件,并确保在出现错误时将正确完成。
答案 2 :(得分:0)
只有一个可能的原因(恕我直言) - 文件database.txt
在你写信之前不是空的(尽管你的评论中有断言)。< / p>
所以你的输出是O.K.
一开始就有你的字符串Hello!
- 其余的是文件的原始内容。
所以你的f.read()
开始读到实际位置(用于阅读或写作) - 它就是就在你写完之后,i。即在符号!
之后。所以 - 在你的情况下 - 它将从t
开始阅读。
您可以使用f.seek(position)
来更改您的实际位置 - 在您的情况下f.seek(0)
(在文件的开头),然后再使用 f.read()
。
所以你的完整代码是:
f = open("database.txt", "r+")
f.write("Hello!")
f.seek(0)
print f.read(6) # Note 6 as number of bytes to read
f.close()
答案 3 :(得分:-1)
我认为您应该使用'w'而不是'r'打开文件写作权限以使用写入功能。