ලිපිගොනු ලිපිගොනු ලිවීමට නිවැරදි ක්‍රමය කුමක්ද?


1088

මම පුරුදු වෙලා print >>f, "hi there"

කෙසේ වෙතත්, එය ක්ෂය print >>වෙමින් පවතින බව පෙනේ . ඉහත පේළිය කිරීමට නිර්දේශිත ක්‍රමය කුමක්ද?

යාවත්කාලීන කිරීම : මේ සියලු පිළිතුරු සමඟ "\n"... මෙය විශ්වීය හෝ යුනික්ස් විශේෂිතද? IE, මම "\r\n"වින්ඩෝස් හි කළ යුතුද?


11
"\ n" යුනික්ස් විශේෂිත නොවේ. ගොනුව පෙළ ප්‍රකාරයේදී විවෘත කළ විට (පෙරනිමිය), එය ස්වයංක්‍රීයව වත්මන් වේදිකාව සඳහා අවසන් වන නිවැරදි රේඛාවට පරිවර්තනය වේ. "\ R \ n" ලිවීම "\ r \ r \ n" නිපදවන අතර එය වැරදිය.
ඩී කෝට්සි

Ascii කේතය බැලීමට මුද්‍රණ නියෝග (os.linesep) ප්‍රකාශය එක් කරන්න (බොහෝ යුනික්ස් පද්ධති 10)
ස්ටෙෆාන්

එය අතහැර දමා ඇතැයි ඔබ සිතන්නේ ඇයි?
xxx ---

Answers:


1183

මෙය තරම් සරල විය යුතුය:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

ප්‍රලේඛනයෙන්:

os.linesepපෙළ ප්‍රකාරයේදී ගොනු විවෘත කිරීමේදී රේඛීය ටර්මිනේටරයක් ​​ලෙස භාවිතා නොකරන්න (සුපුරුදු පරිදි); සියලු වේදිකාවල ඒ වෙනුවට තනි '\ n' භාවිතා කරන්න.

සමහර ප්‍රයෝජනවත් කියවීම:


38
මෙම උදාහරණය විවෘත / සමීප උදාහරණයට වඩා හොඳය. භාවිතා withකිරීම ගොනුවක් වැසීමට මතක තබා ගැනීමට ආරක්ෂිත ක්‍රමයකි.
ඊයල්

20
මට කතා කරන්න අවශ්‍ය නැද්ද the_file.close()?
හුසේන්

21
නැත ඔබ නොකරන්න: stackoverflow.com/questions/3012488/…
තල් ජෙරොම්

1
Or හෝර්ස්මිත්: මට පේනවා. මගේ නවතම සංස්කරණය මගේ අභිප්‍රාය පැහැදිලි කරයි යැයි සිතමි. මගේ පිළිතුරු “තරමක් නිෂ් less ල සහ නොමඟ යවන සුළු” නම් ඒවා සංස්කරණය කිරීමට නිදහස් වන්න.
ජොන්සිවෙබ්

1
@ user3226167: එය සිත්ගන්නා කරුණකි. සරල පෙළ ලිවීමට ඔබ ද්විමය ගොනුවක් විවෘත කරන්නේ ඇයි?
ජොන්සිවෙබ්

965

print()පයිතන් 2.6+ සිට ලබා ගත හැකි ශ්‍රිතය ඔබ භාවිතා කළ යුතුය

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

පයිතන් 3 සඳහා ඔබට අවශ්‍ය නොවේ import, මන්ද print()ශ්‍රිතය පෙරනිමිය වේ.

විකල්පය වනුයේ:

f = open('myfile', 'w')
f.write('hi there\n')  # python will convert \n to os.linesep
f.close()  # you can omit in most cases as the destructor will call it

සිට උපුටා දැක්වීම නව රේඛා සම්බන්ධයෙන් පයිතන් ප්‍රලේඛනයෙන් :

නිමැවුමේදී, නව '\n'රේඛාව කිසිවක් නොමැති නම්, ලියා ඇති ඕනෑම අක්ෂර පද්ධති පෙරනිමි රේඛා බෙදුම්කරුට පරිවර්තනය කරනු ලැබේ os.linesep. නව රේඛාවක් නම් '', පරිවර්තනයක් සිදු නොවේ. නව රේඛාව වෙනත් නෛතික අගයන් නම්, '\n'ලියා ඇති ඕනෑම අක්ෂර ලබා දී ඇති නූලට පරිවර්තනය කරනු ලැබේ.


36
-1 "ඔබට සහතික වීමට අවශ්‍ය නම්," නව රේඛාව \nඅවශ්‍ය වනු ඇත " වෙනුවට os.linesep නූලට එක් කරන්න, එසේ නොමැතිනම් ඔබට \r\r\nවින්ඩෝස් ලැබෙනු ඇත. Os.linesep සමඟ කිසිසේත් සම්බන්ධ වීමට හේතුවක් නැත.
ජෝන් මචින්

7
Or සෝරින්: ලිවීමේ මාදිලිය එක් කිරීම සඳහා වන ඔබේ සංස්කරණය ඇත්තෙන්ම වැඩිදියුණු කිරීමකි. කෙසේ වෙතත් ඔබ පුදුම සහගත ලෙස os.linesep ගැන නොසැලී සිටියි. මගේ පිළිතුර බලන්න. මාර්ගය වන විට, ඔබ උපුටා දක්වන ලියකියවිලි 3.x සඳහා වන නමුත් මෙම කොටස පෙළ ප්‍රකාරයේදී 2.x සඳහා ද වලංගු වේ: ලියා ඇති ඕනෑම '\ n' අක්ෂර පද්ධති පෙරනිමි රේඛා බෙදුම්කරුට පරිවර්තනය කරනු ලැබේ, os.linesep * . .. වින්ඩෝස්: ලිවීම os.linesep ලිවීම හා සමාන වේ \r\nඅඩංගු \nවන os.linesep භාෂාවට පරිවර්තනය කර ඇති \r\nඅවසාන ප්රතිඵලය, එසේ \r\r\n.
ජෝන් මචින්

7
O ජෝන් ඔබ හරි, මම os.linesep දෝෂය නිවැරදි කළා. ස්තූතියි.
සෝරින්

3
එකතු කිරීම open('myfile','a')වෙනුවට එය open('myfile','w')නොවේද?
නෙඩාර්ක්

6
පිළිබඳ පැත්තෙන් ඒ @BradRuderman POSIX පෙළ ගොනුවක් තුල "රේඛාව" කවරේ දැයි සඳහා සම්මත, එනම්, පසුගිය මාර්ගය පවා, එය නව පේළියකට යොමු කිරීමේ අක්ෂරය විසින් පෙළ ගොනුවක් සෑම රේඛාවක් අවසන් කළ යුතු ය.
රෝද රථය

120

මෙම පිඹුරා ලේඛන මේ ආකාරයට නිර්දේශ:

with open('file_to_write', 'w') as f:
    f.write('file contents\n')

ඉතින් මම සාමාන්‍යයෙන් කරන ක්‍රමය මෙයයි :)

Docs.python.org වෙතින් ප්‍රකාශය :

ගොනු වස්තු සමඟ කටයුතු කිරීමේදී 'with' යතුර භාවිතා කිරීම හොඳ පුරුද්දකි . මෙමඟින් වාසියක් ඇත්තේ ගොනුව එහි කට්ටලය අවසන් වූ පසු නිසි පරිදි වසා දැමීමයි. සමාන උත්සාහක-අවසාන වාරණ ලිවීමට වඩා එය කෙටි ය.


1
withඇතුළත ලූපයක් කැදැල්ලට අවශ්‍ය විට මම මේ ආකාරයට කැමති නැත . එමඟින් මගේ ලූපය ඉදිරියට යන විට ගොනුව නිරන්තරයෙන් විවෘත කර වසා දමයි. සමහර විට මට මෙහි යමක් මග හැරී ඇති අතර, හෝ මෙය ඇත්ත වශයෙන්ම මෙම සුවිශේෂී අවස්ථාවෙහි අවාසියක් ද?
සිබ්ස් සූදුව

40
සමඟ ඇති ලූප ගැන කුමක් කිව හැකිද?
j7nn7k

line j7nn7k රේඛාව සඳහා fd:
momstouch

87

Os.linesep සම්බන්ධයෙන්:

වින්ඩෝස් හි හරියටම සංස්කරණය නොකළ පයිතන් 2.7.1 පරිවර්තක සැසිය මෙන්න:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

වින්ඩෝස් මත:

බලාපොරොත්තු වූ පරිදි, os.linesep කරන්නේ නැති එකම ප්රතිඵලය නිෂ්පාදනය '\n'. එය එකම ප්‍රති come ල ලබා ගත හැකි ක්‍රමයක් නොමැත. 'hi there' + os.linesepට සමාන 'hi there\r\n'වන අතර එය සමාන නොවේ'hi there\n' .

මෙය සරලයි: භාවිතය \nස්වයංක්‍රීයව os.linesep වෙත පරිවර්තනය වේ. පයිතන් සිට වින්ඩෝස් දක්වා වූ පළමු වරායේ සිට එය එතරම් සරල ය.

වින්ඩෝස් නොවන පද්ධති වල os.linesep භාවිතා කිරීමේ කිසිදු තේරුමක් නැති අතර එය වින්ඩෝස් මත වැරදි ප්‍රති results ල ලබා දෙයි.

Os.linesep භාවිතා නොකරන්න!


විශිෂ්ට උදාහරණයක් - ඔබ අයිපයිතන් භාවිතා කරන්නෙක් නම් කුතුහලයෙන් සිටිනවාද? සැසි හැඩතල ගැන්වීම සඳහා හොඳ කාර්යයන්
ඇල්වින්

ඔබ අපට මෙහි පැවසීමට උත්සාහ කරන්නේ කුමක්දැයි මට සම්පූර්ණයෙන්ම විශ්වාස නැත. මෙහෙයුම් පද්ධතිය විසින් අර්ථ දක්වා ඇති පරිදි os.linesep විසින් රේඛීය කාලීන අක්‍ෂරය (හෝ නූල්) ලබා දෙනු ඇත. පෙරනිමියෙන් රේඛා අවසානය සඳහා වින්ඩෝස් \ r \ n භාවිතා කරයි. කෙසේ වෙතත්, තනි \ n හඳුනාගෙන ඇත. Port n භාවිතා කිරීමෙන් සම්පූර්ණයෙන්ම අතේ ගෙන යා හැකි OUTPUT එකක් ලැබෙනු ඇත, නමුත් කවුළු වල os.linesep වැරදිය.
ගුස්ඩෝර්

5
Us ගුස්ඩෝර්: කාරණය වන්නේ ඔබ os.linesepවින්ඩෝස් තුළ පෙළ ප්‍රකාරයේදී පැහැදිලිවම භාවිතා කරන්නේ නම්, ප්‍රති come ලය \r\r\nවැරදිය. "වින්ඩෝස් භාවිතා කරයි ..." අර්ථ විරහිත ය. සී ධාවන කාල පුස්තකාලය (එම නිසා පයිතන්) පෙළ ප්‍රකාරයේදී ප්‍රතිදානය \nවෙත පරිවර්තනය කරයි \r\n. වෙනත් මෘදුකාංග වෙනස් ලෙස හැසිරෙනු ඇත. වින්ඩෝස් හි ක්‍රියාත්මක වන සියලුම මෘදුකාංග \nපෙළ ප්‍රකාරයේදී කියවීමේදී හුදකලාව රේඛා බෙදුම්කරුවෙකු ලෙස හඳුනා ගනී . පයිතන් කරනවා. මයික්‍රොසොෆ්ට් හි නොට්පෑඩ් පෙළ සංස්කාරකය එසේ නොවේ.
ජෝන් මචින්

6
මිකී-මූසික මෘදුකාංගයක් සමඟ වෙනත් අයෙකු එය කියවනු ඇති බවට තර්ක කළ හැකිය \r...
ජෝන් මචින්

2
Us ගුස්ඩෝර් ඔබ වෙනත් භාෂාවක සිට පයිතන් වෙත පැමිණෙමින් සිටින අතර, එහිදී '\ n' භාවිතා කිරීමෙන් කවුළුව මත '\ n' ප්‍රතිදානය ලැබෙනු ඇත, '\ r \ n' වෙනුවට - එය ගොළු අපේක්ෂා කරන '\ r' හිඟය. පෙළ සංස්කාරකවරුන්? ජෝන් පවසන පරිදි, පයිතන් හැසිරෙන්නේ එලෙස නොවේ - '\ n' ස්වයංක්‍රීයව '\ r \ n' මගින් ප්‍රතිස්ථාපනය වේ. එබැවින් පැහැදිලිව පැවසීම os.linesep මෙහි "වැරදි" ය. එය වගේ Department of Redundancy Department. ඔව් ඔබට එය කළ හැකිය. නැහැ, ඔබට අවශ්‍ය නැහැ.
මෙවලම් සාදන්නා

57

"නිවැරදි" ක්‍රමයක් ඇතැයි මම නොසිතමි.

මම භාවිතා කරන්නේ:

with open ('myfile', 'a') as f: f.write ('hi there\n')

මතක සටහන් වල ටිම් ටෝඩි .


නමුත් OP ට ගොනුවට අමතර දේවල් ලිවීමට අවශ්‍ය විය හැකිය. withවිෂය පථයෙන් බැහැර වූ විට ගොනුව වසා දමනු ඇත .
කීත්

5
අර්ම්, ඔව්. භාවිතා කිරීමේ අදහස එයයි. ඔබට ගොනුව විවෘතව තබා ගැනීමට අවශ්‍ය නම්, ආරම්භයේදීම විවෘතව
අමතා

1
tmtrw. සැබෑ. OP එකතු වෙමින් තිබුණි.
හයිපර්බොරියස්

1
පයිතන් සම්බන්ධයෙන් ගත් කල, ආර්.අයි.පී ටිම් ටෝඩි - ඉතා නිවැරදිව එසේ නම්
Mr_and_Mrs_D

1
මෙම zen of perlවිරෝධෝක්තියක් ටිකක් වනු ඇත.
ඩාවෝස්

21

පයිතන් 3 හි එය ශ්‍රිතයකි, නමුත් පයිතන් 2 හි ඔබට මෙය ප්‍රභව ගොනුවේ ඉහළට එක් කළ හැකිය:

from __future__ import print_function

එහෙනම් ඔයා කරනවා

print("hi there", file=f)

17

ඔබ බොහෝ දත්ත හා වේගය ලියන්නේ නම් ඔබ සැලකිලිමත් විය යුතුය f.write(...). මම ඉක්මන් වේග සංසන්දනයක් කළ අතර එය print(..., file=f)විශාල සංඛ්‍යාවක් ලිවීමට වඩා සැලකිය යුතු වේගයකින් සිදු විය.

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

සාමාන්‍යයෙන් writeමගේ යන්ත්‍රයේ තත්පර 2.45 කින් නිම කර ඇතprint 4 ගුණයක් (තත්පර 9.76) පමණ ගත විය. එසේ පැවසුවහොත්, බොහෝ තාත්වික තත්වයන් තුළ මෙය ගැටළුවක් නොවනු ඇත.

ඔබ සමඟ යාමට තෝරා ගන්නේ නම්, print(..., file=f)වරින් වර නව රේඛාව යටපත් කිරීමට ඔබට අවශ්‍ය වනු ඇත, නැතහොත් එය වෙනත් දෙයක් සමඟ ප්‍රතිස්ථාපනය කරන්න. විකල්ප endපරාමිතිය සැකසීමෙන් මෙය කළ හැකිය , උදා;

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

ඔබ තෝරාගන්නා ඕනෑම ආකාරයකින් withකේතය කියවීමට පහසු වන බැවින් භාවිතා කිරීමට මම යෝජනා කරමි .

යාවත්කාලීන කිරීම : කාර්ය සාධනයේ මෙම වෙනස පැහැදිලි කරනුයේ writeඉහළ බෆරයකින් යුක්ත වන අතර ඕනෑම තැටියක් ලිවීමට පෙර නැවත පැමිණේ ( මෙම පිළිතුර බලන්න ), නමුත් print(බොහෝ විට) රේඛීය බෆරින් භාවිතා කරයි. මේ සඳහා සරල පරීක්‍ෂණයක් වනුයේ දිගු ලිවීම් සඳහා කාර්ය සාධනය පරීක්ෂා කිරීමයි, එහිදී රේඛීය බෆරින් සඳහා අවාසි (වේගය අනුව) අඩු ලෙස ප්‍රකාශ වේ.

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

කාර්ය සාධන වෙනස දැන් වඩා අඩුවෙන් උච්චාරණය වන අතර සාමාන්‍ය කාලය සඳහා 2.20s writeසහ 3.10s වේ print. මෙම ලූං රේඛා කාර්ය සාධනය ලබා ගැනීම සඳහා ඔබට නූල් පොකුරක් සංයුක්ත කිරීමට අවශ්‍ය නම්, printවඩාත් කාර්යක්ෂම වන භාවිත අවස්ථා ටිකක් දුර්ලභ ය.


10

3.5 සිට ඔබට ඒ pathlibසඳහා ද භාවිතා කළ හැකිය :

Path.write_text(data, encoding=None, errors=None)

පා mode මය ආකාරයෙන් පෙන්වා ඇති ගොනුව විවෘත කරන්න, එයට දත්ත ලිවීම සහ ගොනුව වසා දැමීම:

import pathlib

pathlib.Path('textfile.txt').write_text('content')

6

ඔබ රේඛාව පැවසූ විට එයින් අදහස් වන්නේ අනුක්‍රමික අක්ෂර '\ n' ලෙස අවසන් වීමයි. රේඛාව යම් අවස්ථාවක දී අවසාන විය යුතු බැවින් එක් එක් පේළියේ අවසානයේ '\ n' සලකා බැලිය යුතුය. මෙන්න විසඳුම:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write("Hello")

එක් එක් ලිවීමෙන් පසුව කර්සරය නව පේළියකට ගෙන යාමෙන් පසුව උපග්‍රන්ථයේ, ඔබට wමාදිලිය භාවිතා කිරීමට අවශ්‍ය නම් ශ්‍රිතය \nඅවසානයේ අක්ෂර එකතු කළ යුතුය write():

the_file.write("Hello\n")

1
"එක් එක් කර්සරය නව රේඛාවකට ගෙන ගිය පසු උපග්‍රන්ථ ප්‍රකාරයේදී" - නැත එය එසේ නොවේ.
Se

3

කෙනෙකුට ioමොඩියුලය පහත පරිදි භාවිතා කළ හැකිය :

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)

2

නළයේ ඇති ගොනුවක පෙළ ලිවීමට භාවිතා කළ හැකිය:

filehandle = open("text.txt", "w")
filebuffer = ["hi","welcome","yes yes welcome"]
filehandle.writelines(filebuffer)
filehandle.close()

1
with open('file_to_write', 'w') as f:ප්‍රකාශයක් සහිත ගොනුවකට ලිවීම සැමවිටම වඩාත් සුදුසුය . යමෙකු අහම්බෙන් යමක් ලියා ඇත්නම් ඒ සඳහා පැහැදිලි close()ඇමතුමක් නොලැබෙනු ඇති බවට වග බලා ගැනීම පහසුය
Artūras Jonkus

0

ඔබටත් උත්සාහ කළ හැකිය filewriter

pip install filewriter

from filewriter import Writer

Writer(filename='my_file', ext='txt') << ["row 1 hi there", "row 2"]

වෙත ලියයි my_file.txt

__str__ආධාරක සහිතව නැවත කළ හැකි හෝ වස්තුවක් ගනී .


0

මට නව පේළි ගොඩක් ලිවීමට අවශ්‍ය වූ විට, printශ්‍රිතයක් භාවිතා කරන ලැම්බඩා අර්ථ දක්වන්නෙමි :

out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')

මෙම ප්‍රවේශය මඟින් printශ්‍රිතය සමඟ ඇති සියලුම අංග භාවිතා කළ හැකිය .

යාවත්කාලීන කිරීම: අදහස් දැක්වීමේ කොටසෙහි ජෝර්ජි විසින් සඳහන් කර ඇති පරිදි, partialශ්‍රිතය සමඟ මෙම අදහස තවදුරටත් වැඩිදියුණු කළ හැකිය :

from functools import partial
fwl = partial(print, file=out)

IMHO, මෙය වඩාත් ක්‍රියාකාරී හා අඩු ගුප්ත ප්‍රවේශයකි.


2
හෝ මෙය ලිවීමට තවත් (බොහෝ විට පිරිසිදු) ක්‍රමයක් : from functools import partial; fwl = partial(print, file=out).
ජෝර්ජි

ජෝර්ජි ඔබේ ප්‍රවේශය කොතරම් හොඳද යත් එය නව පිළිතුරක් ලෙස ලබා දිය හැකිය.
MxNx

1
අදහස ඔබේ අදහසමයි, ක්‍රියාත්මක කිරීම ටිකක් වෙනස්. ඔබට අවශ්‍ය නම්, එය ඔබේ පිළිතුරට සංස්කරණයකින් එක් කළ හැකිය. මම ඒ සමඟ හොඳින්.
ජෝර්ජි
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.