2013-11-04 13 views
-1

我有以下代碼:Python的I/O沒有創造新的生產線

lines[usernum] = str(user) + "\n"   
f = open('users.txt','w') 
userstr = str(lines) 
f.write(userstr) 

切實我修改lines列表中usernum,然後寫回原來的文件'users.txt'。但是,即使添加「\ n」,lines中的每行都會寫入一行而不是單行。爲什麼是這樣?

+1

你期望'str(行)'做什麼**正確**,**爲什麼**? –

回答

2

這是因爲str(lines)不會做你期望它做的事情:

>>> lst = ['This', 'is a\n', 'fancy\n', 'list'] 
>>> print(str(lst)) 
['This', 'is a\n', 'fancy\n', 'list'] 

正如你所看到的,它會寫列表的表示,而不是打印出各條線。您可以使用str.join到列表元素結合:

lines[usernum] = str(user) 
with open('users.txt', 'w') as f: 
    f.write('\n'.join(lines)) 

使用'\n'作爲連接字符將確保一個換行符插入每個列表元素之間,所以你並不需要把它添加到每一個產品負責手動。

此外,在處理文件時,建議在打開它們時使用with語句,以確保在完成對它們的處理後可以正確關閉它們。

+0

這似乎在每次運行此文件時在文件末尾添加一行。我如何防止這種情況發生? – dojogeorge

+0

連接只會在*列表元素之間添加換行符,而'f.write'本身不會以換行符結束行。所以最後可能是你的最後一個列表項有一個換行符。您可以使用'str.strip()'去除字符串中的前導和尾部空白。如果你想將它應用於所有列表元素,你可以這樣做:'f.write('\ n'.join(map(lambda x:x.strip(),lines)))'' – poke

1

您正在將文件列表的字符串表示寫入文件。

Python容器的字符串表示使用表示的內容,而不是直接寫入字符串。

使用writelines()函數寫字符串序列:

f.writelines(lines) 

或單獨寫的每一行:

for line in lines: 
    f.write(line) 

或加入線成一個長字符串:

f.write(''.join(lines)) 

後者還允許您在撰寫本文時添加新行,使用\n作爲連接字符串:

f.write('\n'.join(lines)) 

其中lines包含字符串沒有換行。

1

使用一個for循環和'\n'寫上新的生產線的每個項目:

with open('users.txt','w') as f: 
    for line in lines: 
     f.write('{}\n'.format(line)) 

listdict簡單的返回str版本對象的Python對象上調用str(),寫它的內容到一個文件你應該循環它。

演示:

lines = [1, 'foo', 3, 'bar'] 
with open('users.txt','w') as f: 
    for line in lines: 
     f.write('{}\n'.format(line)) 
...   
>>> !cat users.txt 
1 
foo 
3 
bar 
+0

這有效,但似乎總是在文檔的末尾添加一個空白的新行,如果我多次運行它 – dojogeorge

+0

@ user1045280使用'f.write('\ n'.join(str(x)for x in lines) )'如果你不想在最後一行輸入'\ n'。 –