[英]How to write a list to a file with newlines in Python3
我正在嘗試使用 Python 3 將數組(列表?)寫入文本文件。目前我有:
def save_to_file(*text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
for lines in text:
print(lines, file = myfile)
myfile.close
這會將看起來像數組的內容直接寫入文本文件,即,
['element1', 'element2', 'element3']
username@machine:/path$
我要做的是創建文件
element1
element2
element3
username@machine:/path$
我嘗試了不同的方法來循環並附加一個“\\n”,但似乎寫入正在一個操作中轉儲數組。 問題類似於如何將字符串列表寫入文件,添加換行符? 但是語法看起來像是用於 Python 2 的? 當我嘗試修改后的版本時:
def save_to_file(*text):
myfile = open('/path/to/filename.txt', mode='wt', encoding='utf-8')
for lines in text:
myfile.write(lines)
myfile.close
...Python shell 給出了“TypeError: must be str, not list”,我認為這是因為 Python2 和 Python 3 之間的變化。讓每個元素都換行我錯過了什么?
編輯:感謝@agf 和@arafangion; 結合你們兩個寫的,我想出了:
def save_to_file(text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
myfile.write('\n'.join(text))
myfile.write('\n')
看起來我對 "*text" 有部分問題(我讀過擴展參數,但直到你寫道 [element] 變成 [[element]] 我得到了一個 str-not-列表類型錯誤;我一直認為我需要告訴定義它正在獲取傳遞給它的列表/數組,並且僅說明“測試”將是一個字符串。)一旦我將其更改為文本並使用 myfile.txt ,它就起作用了。使用 join 寫入,附加的 \\n 將放在文件末尾的最后一個換行符中。
myfile.close
- 去掉你使用with
。 with
自動關閉myfile
,並且您必須像close()
一樣調用close
才能在您不使用with
時執行任何操作。 您應該始終在 Python 3 上使用with
。
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
myfile.write('\n'.join(lines))
不要使用print
寫入文件——使用file.write
。 在這種情況下,你想寫一些中間有換行符的行,所以你可以用'\\n'.join(lines)
連接這些行,並將創建的字符串直接寫入文件。
如果要素lines
不是字符串,試試:
myfile.write('\n'.join(str(line) for line in lines))
首先轉換它們。
由於不同的原因,您的第二個版本不起作用。 如果你通過
['element1', 'element2', 'element3']
到
def save_to_file(*text):
它會變成
[['element1', 'element2', 'element3']]
因為*
將它獲得的每個參數放入一個列表中,即使您傳遞的內容已經是一個列表。
如果你想支持傳遞多個列表,並且仍然一個接一個地寫它們,那么做
def save_to_file(*text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
for lines in text:
myfile.write('\n'.join(str(line) for line in lines))
myfile.write('\n')
或者,對於一個列表,去掉*
並執行我上面所做的操作。
編輯: @Arafangion 是對的,您可能應該只使用b
而不是t
來寫入您的文件。 這樣,您就不必擔心不同平台處理換行符的不同方式。
那里有很多錯誤。
當您迭代“文本中的行”時,由於這些錯誤,您真正在做的是迭代函數中的參數,因為“文本”代表您的所有參數。 這就是'*'的作用。 (至少,在這種情況下。嚴格來說,它迭代所有剩余的參數 - 請閱讀文檔)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.