Dosyalara yazarken Python'da yeni satırları nasıl belirlerim?


313

Java ile karşılaştırıldığında (bir dizede), benzer bir şey yaparsınız "First Line\r\nSecond Line".

Peki, normal bir dosyaya birden çok satır yazmak amacıyla bunu Python'da nasıl yapardınız?


12
Ne denedin? İşe yaradı mı? (Sanırım hayır ya da sormazdın.) Ne oldu?
Greg Hewgill

Sadece bunu yapmanın doğru ve yanlış bir yolu olup olmadığını bilmek istedim, henüz denememiştim.
FabianCook

5
Python'un Java'daki printgibi çalıştığını System.out.printlnve metnin arkasına otomatik olarak yeni bir satır eklediğini anlıyorsunuz , değil mi?
Greg Hewgill

Dosyaları yazmak için istiyorum :)
FabianCook

2
printPython Açıklamada (ayrıntılar böylece sürümü için referans dokümanlar ile kontrol Python 2.x ve Python 3.x arasında farklılık) dosyalara yazma için kullanılabilir. printPython 2.x içinde - printPython 3.x içinde
Greg Hewgill

Yanıtlar:


357

Ne kadar doğru olmak istediğinize bağlıdır. \ngenellikle işi yapar. Gerçekten doğru yapmak istiyorsanız, ospaketteki yeni satır karakterine bakın . (Aslında denir linesep.)

Not: Python API'sını kullanarak dosyalara yazarken os.linesep,. Sadece kullanın \n; Python bunu otomatik olarak platformunuz için uygun yeni satır karakterine çevirir.


14
Sağladığınız bağlantıdan "Metin modunda açılan dosyaları yazarken os.linesep komutunu satır sonlandırıcı olarak kullanmayın (varsayılan); bunun yerine tüm platformlarda tek bir '\ n' kullanın." Peki "doğru" ile ne demek istiyorsun ve onların ve yorumunun nedenleri neler?
Yasen

21
@Yasen: Windows'ta, yeni satır sırası "\r\n". Bu os.linesepolacak demektir "\r\n". Metin modunda bir dosyaya yazarken, yeni satır çevirisini yazarken yapar; yani, "\n"çıktıdaki her biri "\r\n"sonuçta elde edilen dosyaya çevrilecektir . Yazdığınız metinde zaten "\r\n"sekanslar varsa bunun nasıl bir sorun olduğunu görebilirsiniz : sonuç "\r\r\n"her satırın sonunda olacaktır . En azından sanırım: Gerçekten denemedim.
Nate CK

Cevabı zaten düzeltmenin ve yanlış os.linesepteklifi kaldırmanın zamanı gelmiş olabilir , değil mi? Büyük bir drama olmazdı ve yazarın gururu sanırım çok fazla acı çekmez
ZAB

8
Benim gururumu bilmiyorsun. Ama daha ciddisi, lineseporada olduğunu ve var olduğunu not etmek yararlı olduğunu düşünüyorum , böylece sistem hattı ayırıcısının ne olduğunu öğrenebilirsiniz.
Charlie Martin

2
@ZAB Tüm dizeler metin modundaki dosyalara yazılmaz. linesepyine de faydalı olabilir.
Kyle Strand

61

Yeni çizgi karakteri \n. Bir dize içinde kullanılır.

Misal:

    print('First line \n Second line') 

\nyeni satır karakteri nerede .

Bu sonuç verir:

First line
 Second line

Python 2 kullanıyorsanız, yazdırma işlevinde parantez kullanmazsınız.


7
bir öneri olarak, \ n'den sonra 'beyaz boşluk' vermezsek, ikinci satırda bir boşluk girintisi alamazız. ne demek istediğim: print 'First line \ nİkinci satır'
Manoj Kumar

Bir dizenin içinde kaçan "\ n" karakterini kullandığınıza işaret ettiğiniz için teşekkür ederiz! Belki de benim gibi yeni Python çocuklar için belli değil
GrayedFox

3
@ all / kimse / ManojKumar a = 1; b = 2; baskı (a, "\ n", b) o / p: 1 2 (2, beyaz boşluk girintili yeni satırda düzgün görünmüyor ancak 2 üzerinde beyaz boşluk girintili ayrı satırlarda 1 ve 2 olduğunu varsayın) Bu durumda, beyaz alanı (bir boşluk girintisi) 2'den önce gelir ve 1 ile girinti yapar. Not: 2 baskı ifadesi kullanmayacağız ve 1 ve 2 ayrı (yeni) satırlarda olacaktır.
PRAFUL ANAND

24

Yeni satırlara ayrı ayrı veya tek bir dize içinde yazabilirsiniz, bu daha kolaydır.

örnek 1

Giriş

line1 = "hello how are you"
line2 = "I am testing the new line escape sequence"
line3 = "this seems to work"

'\ N' yazabilirsiniz:

file.write(line1)
file.write("\n")
file.write(line2)
file.write("\n")
file.write(line3)
file.write("\n")

Çıktı

hello how are you
I am testing the new line escape sequence
this seems to work

ÖRNEK 2

Giriş

Diğerlerinin önceki yanıtlarda belirttiği gibi, \ n'yi dizenizdeki ilgili noktalara yerleştirin:

line = "hello how are you\nI am testing the new line escape sequence\nthis seems to work"

file.write(line)

Çıktı

hello how are you
I am testing the new line escape sequence
this seems to work

Bence çıktılarınız teknik olarak yanlış. İkinci ve üçüncü satır, ilk karakterlerinin solunda bir boşluk bırakarak yazdırılmalıdır. Başka bir çözüm, bu iki boşluğu çizgi değişkeninden kaldırmak olacaktır.
Christian Westbrook

Her halükarda, örnek 2'deki kod, tam olarak görüntülediğiniz çıktıyı üretmez.
Christian Westbrook

10

Aynı anda birkaç metin satırı giriyorsanız, bunu en okunabilir biçim olarak görüyorum.

file.write("\
Life's but a walking shadow, a poor player\n\
That struts and frets his hour upon the stage\n\
And then is heard no more: it is a tale\n\
Told by an idiot, full of sound and fury,\n\
Signifying nothing.\n\
")

Her satırın sonundaki \ yeni satırdan kaçar (bu hataya neden olur).


İç paranteziniz, bu nedenle kaçış çizgileri gerekli değildir. Dizeyi sonlandırın, yeni bir satıra geçin ve yeni bir satıra başlayın. Başka yeni satır olmayacak ve kaçmanıza gerek kalmayacak. Ayrıca, yukarıdakileri yapsanız bile, yeni çizgi karakteri ve kaçış birbirinizi iptal eder.
user144153

9

Python'da yeni satır karakterini kullanabilirsiniz; \n


3
@maazza: yaklaşık soru değil yazma ?
mhawke

9

En basit çözüm

Yalnızca printargüman olmadan çağrı yaparsanız , boş bir satır çıkacaktır.

print

Çıktıyı böyle bir dosyaya bağlayabilirsiniz (örneğinizi dikkate alarak):

f = open('out.txt', 'w')
print 'First line' >> f
print >> f
print 'Second line' >> f
f.close()

Sadece OS-agnostik değil ( ospaketi kullanmak zorunda kalmadan ), \ndizelere koymaktan daha okunabilir .

açıklama

print()Fonksiyon denir dizenin sonuna, isteğe bağlı bir anahtar kelime argüman vardır end, örneğin için OS'nin satır karakteri, bu durumda varsayılan. \n. Yani, aradığınızda print('hello'), Python aslında yazdırıyor 'hello' + '\n'. Bu, printherhangi bir argüman olmadan aradığınızda , aslında yazdırılıyor '' + '\n', bu da yeni bir satıra neden oluyor.

Alternatif

Çok satırlı dizeler kullanın.

s = """First line
    Second line
    Third line"""
f = open('out.txt', 'w')
print s >> f
f.close()

6

Platformdan bağımsız hat kesici: Linux, windows ve IOS

import os
keyword = 'physical'+ os.linesep + 'distancing'
print(keyword)

Çıktı:

physical
distancing

4

Aynı şekilde '\n', muhtemelen ihtiyacınız olmasa da '\r'. Java sürümünüzde olmasının bir nedeni var mı? İhtiyacınız varsa / istiyorsanız, Python'da da aynı şekilde kullanabilirsiniz.


1
\ryeni satır için sistem özelliğini aldığınızda şu şekilde görünür\r\n
FabianCook

4
@SmartLemon: Bu muhtemelen Windows'da doğrudur, ancak diğer sistemlerin çoğunda \ntek yeni satır karakteri vardır.
Greg Hewgill

@ Jean-MichaëlCelerier: Bu, Mac OS X'den önce doğruydu. Mac OS X kullanmadan önce \n.
Greg Hewgill

Tamam, yorumumu kaldıracağım, o zaman gerçekten işe yaramaz. Afedersiniz!
Jean-Michaël Celerier

4

\ n - basit yeni satır karakteri ekleme özelliği:

# Here's the test example - string with newline char:
In [36]: test_line = "Hi!!!\n testing first line.. \n testing second line.. \n and third line....."

# Output:
In [37]: print(test_line)

Hi!!!
 testing first line..
 testing second line..
 and third line.....


1

Diğer cevaplarda belirtildiği gibi: "Yeni çizgi karakteri \ n. Bir dize içinde kullanılır".

Ben en basit ve okunabilir yolu yeni satır için ad olarak nl kullanarak "format" işlevini kullanmak ve yazdırmak istediğiniz kesin biçime yazdırmak için dizeyi kırmak olduğunu buldum:

print("line1{nl}"
      "line2{nl}"
      "line3".format(nl="\n"))

Bu çıktı:

line1
line2
line3

Bu şekilde görevi yerine getirir ve ayrıca kodun yüksek okunabilirliğini sağlar :)


0

\ n bir dizenin çizgilerini ayırır. Aşağıdaki örnekte, kayıtları bir döngüde yazmaya devam ediyorum. Her kayıt ile ayrılır \n.

f = open("jsonFile.txt", "w")

for row_index in range(2, sheet.nrows):

  mydict1 = {
    "PowerMeterId" : row_index + 1,
    "Service": "Electricity",
    "Building": "JTC FoodHub",
    "Floor": str(Floor),
    "Location": Location,
    "ReportType": "Electricity",
    "System": System,
    "SubSystem": "",
    "Incomer": "",
    "Category": "",
    "DisplayName": DisplayName,
    "Description": Description,
    "Tag": tag,
    "IsActive": 1,
    "DataProviderType": int(0),
    "DataTable": ""
  }
  mydict1.pop("_id", None)
  f.write(str(mydict1) + '\n')

f.close()

0

Etkileşimli python kabuğu veya bir Jupyter dizüstü bilgisayar kullanarak bir dizeyi incelediğinizde, \nve diğer ters eğik dizelerin tam anlamıyla\t işlendiğini belirtmek gerekir :

>>> gotcha = 'Here is some random message...'
>>> gotcha += '\nAdditional content:\n\t{}'.format('Yet even more great stuff!')
>>> gotcha
'Here is some random message...\nAdditional content:\n\tYet even more great stuff!'

Yeni satırlar, sekmeler ve diğer özel yazdırılmamış karakterler yalnızca yazdırıldığında veya bir dosyaya yazıldığında boşluk olarak işlenir :

>>> print('{}'.format(gotcha))
Here is some random message...
Additional content:
    Yet even more great stuff!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.