我有以下代碼: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
中的每行都會寫入一行而不是單行。爲什麼是這樣?
我有以下代碼: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
中的每行都會寫入一行而不是單行。爲什麼是這樣?
這是因爲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
語句,以確保在完成對它們的處理後可以正確關閉它們。
這似乎在每次運行此文件時在文件末尾添加一行。我如何防止這種情況發生? – dojogeorge
連接只會在*列表元素之間添加換行符,而'f.write'本身不會以換行符結束行。所以最後可能是你的最後一個列表項有一個換行符。您可以使用'str.strip()'去除字符串中的前導和尾部空白。如果你想將它應用於所有列表元素,你可以這樣做:'f.write('\ n'.join(map(lambda x:x.strip(),lines)))'' – poke
您正在將文件列表的字符串表示寫入文件。
Python容器的字符串表示使用表示的內容,而不是直接寫入字符串。
使用writelines()
函數寫字符串序列:
f.writelines(lines)
或單獨寫的每一行:
for line in lines:
f.write(line)
或加入線成一個長字符串:
f.write(''.join(lines))
後者還允許您在撰寫本文時添加新行,使用\n
作爲連接字符串:
f.write('\n'.join(lines))
其中lines
包含字符串沒有換行。
使用一個for循環和'\n'
寫上新的生產線的每個項目:
with open('users.txt','w') as f:
for line in lines:
f.write('{}\n'.format(line))
像list
或dict
簡單的返回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
這有效,但似乎總是在文檔的末尾添加一個空白的新行,如果我多次運行它 – dojogeorge
@ user1045280使用'f.write('\ n'.join(str(x)for x in lines) )'如果你不想在最後一行輸入'\ n'。 –
你期望'str(行)'做什麼**正確**,**爲什麼**? –