Zapisywanie ciągu znaków do pliku w nowym wierszu za każdym razem

259

Chcę dodawać nowy wiersz do mojego ciągu za każdym razem, gdy dzwonię file.write(). Jak najłatwiej to zrobić w Pythonie?

kaushik
źródło

Odpowiedzi:

294

Użyj „\ n”:

file.write("My String\n")

Zobacz podręcznik Python w celach informacyjnych.

halfdan
źródło
3
Jeśli używasz zmiennych do skomponowania rekordu, możesz dodać + „\ n” na końcu, na przykład fileLog.write (var1 + var2 + „\ n”).
Filipe
4
W nowszych wersjach Pythona (3.6+) możesz także używać f-stringów:file.write(f"{var1}\n")
halfdan
109

Możesz to zrobić na dwa sposoby:

f.write("text to write\n")

lub, w zależności od wersji Python (2 lub 3):

print >>f, "text to write"         # Python 2.x
print("text to write", file=f)     # Python 3.x
Greg Hewgill
źródło
używam f.writelines (str (x)), aby zapisać do pliku, gdzie x jest listą, aby teraz powiedzieć, jak napisać listę x do pliku,
kopiując
2
@kaushik: f.write ('\ n' .join (x)) lub f. napisy (i + '\ n' dla i w x)
Steven
Myślę, że metoda f.write jest lepsza, ponieważ można jej używać zarówno w Pythonie 2, jak i 3.
Dang Manh Truong
78

Możesz użyć:

file.write(your_string + '\n')
Krishna K
źródło
3
możesz użyć tego użycia, na przykład, kiedy piszesz int do pliku, możesz użyć file.write (str (a) + '\ n')
未来 陆家嘴 顶尖 的 投资 人
@xikhari Dlaczego? file.write(f"my number is: {number}\n")jest w porządku i czytelny.
Guimoute
24

Jeśli używasz go intensywnie (dużo zapisanych linii), możesz podklasować „plik”:

class cfile(file):
    #subclass file to have a more convienient use of writeline
    def __init__(self, name, mode = 'r'):
        self = file.__init__(self, name, mode)

    def wl(self, string):
        self.writelines(string + '\n')

Teraz oferuje dodatkową funkcję wl, która robi to, co chcesz:

fid = cfile('filename.txt', 'w')
fid.wl('appends newline charachter')
fid.wl('is written on a new line')
fid.close()

Może brakuje mi czegoś takiego jak różne znaki nowej linii (\ n, \ r, ...) lub że ostatni wiersz jest również zakończony nową linią, ale to działa dla mnie.

matematyka
źródło
1
W return Nonetym przypadku nie jest to konieczne, ponieważ po pierwsze nie jest to potrzebne, a po drugie, każda funkcja Pythona Nonejest domyślnie zwracana , gdy nie ma returninstrukcji.
Anna
10

mógłbyś:

file.write(your_string + '\n')

jak sugeruje inna odpowiedź, ale po co używać konkatenacji ciągów (powolna, podatna na błędy), gdy można wywoływać file.writedwa razy:

file.write(your_string)
file.write("\n")

Zauważ, że zapisy są buforowane, więc sprowadza się to do tego samego.

Jean-François Fabre
źródło
6
file_path = "/path/to/yourfile.txt"
with open(file_path, 'a') as file:
    file.write("This will be added to the next line\n")

lub

log_file = open('log.txt', 'a')
log_file.write("This will be added to the next line\n")
Panos Kal.
źródło
4
Otwarcie pliku z parametrem „a” zamiast „w” nie zmienia zapisu do funkcji, aby działał w sposób opisany przez Ciebie. Jedyny efekt, jaki ma, to to, że plik nie zostanie nadpisany, a tekst zostanie dodany do dolnej linii zamiast zaczynać w lewym górnym rogu pustego pliku.
demokrata z
2

Notatka, filenie jest obsługiwana Python 3i została usunięta. Możesz zrobić to samo z openwbudowaną funkcją.

f = open('test.txt', 'w')
f.write('test\n')
użytkownik1767754
źródło
2

O ile nie zapisujesz w plikach binarnych, użyj print. Poniżej przykład dobry do formatowania plików csv:

def write_row(file_, *columns):
    print(*columns, sep='\t', end='\n', file=file_)

Stosowanie:

PHI = 45
with open('file.csv', 'a+') as f:
    write_row(f, 'header', 'phi:', PHI, 'serie no. 2')
    write_row(f)  # newline
    write_row(f, data[0], data[1])

Uwagi:

Mesco
źródło
2

Kolejne rozwiązanie, które pisze z listy przy użyciu fstring

lines = ['hello','world']
with open('filename.txt', "w") as fhandle:
  for line in lines:
    fhandle.write(f'{line}\n')
citynorman
źródło
1

Oto rozwiązanie, które wymyśliłem, próbując rozwiązać ten problem dla siebie, aby systematycznie produkować \ n jako separatory. Pisze przy użyciu listy ciągów, gdzie każdy ciąg jest jedną linią pliku, jednak wydaje się, że może on również działać dla ciebie. (Python 3. +)

#Takes a list of strings and prints it to a file.
def writeFile(file, strList):
    line = 0
    lines = []
    while line < len(strList):
        lines.append(cheekyNew(line) + strList[line])
        line += 1
    file = open(file, "w")
    file.writelines(lines)
    file.close()

#Returns "\n" if the int entered isn't zero, otherwise "".
def cheekyNew(line):
    if line != 0:
        return "\n"
    return ""
democidysta
źródło
Dlaczego nie po prostu with open(path, "w") as file: for line in strList: file.write(line + "\n")? W ten sposób możesz usunąć całą pracę z listą, sprawdzić i mieć tylko 3 linie.
Guimoute