簡體   English   中英

如何在 Python3 中用換行符將列表寫入文件

[英]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來寫入您的文件。 這樣,您就不必擔心不同平台處理換行符的不同方式。

那里有很多錯誤。

  1. 你的縮進搞砸了。
  2. save_to_file 中的 'text' 屬性指的是所有參數,而不僅僅是特定參數。
  3. 您正在使用“文本模式”,這也令人困惑。 請改用二進制模式,以便您對 '\\n' 具有一致且定義的含義。

當您迭代“文本中的行”時,由於這些錯誤,您真正在做的是迭代函數中的參數,因為“文本”代表您的所有參數。 這就是'*'的作用。 (至少,在這種情況下。嚴格來說,它迭代所有剩余的參數 - 請閱讀文檔)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM