นี่เป็นวิธีการแก้ปัญหาของงูหลามที่ดีและเรียบร้อย ฉันไม่พยายามที่จะพูดสั้น ๆ ที่นี่
สิ่งนี้แก้ไขไฟล์ในตำแหน่งแทนที่จะทำสำเนาไฟล์และลอกบรรทัดใหม่จากบรรทัดสุดท้ายของสำเนา หากไฟล์มีขนาดใหญ่จะเร็วกว่าโซลูชัน Perl ที่เลือกไว้เป็นคำตอบที่ดีที่สุด
มันตัดไฟล์สองไบต์ถ้าสองไบต์สุดท้ายคือ CR / LF หรือโดยหนึ่งไบต์ถ้าไบต์สุดท้ายคือ LF จะไม่พยายามแก้ไขไฟล์หากไบต์สุดท้ายไม่ใช่ (CR) LF มันจัดการข้อผิดพลาด ทดสอบใน Python 2.6
ใส่นี้ในไฟล์ที่เรียกว่า "striplast" chmod +x striplast
และ
#!/usr/bin/python
# strip newline from last line of a file
import sys
def trunc(filename, new_len):
try:
# open with mode "append" so we have permission to modify
# cannot open with mode "write" because that clobbers the file!
f = open(filename, "ab")
f.truncate(new_len)
f.close()
except IOError:
print "cannot write to file:", filename
sys.exit(2)
# get input argument
if len(sys.argv) == 2:
filename = sys.argv[1]
else:
filename = "--help" # wrong number of arguments so print help
if filename == "--help" or filename == "-h" or filename == "/?":
print "Usage: %s <filename>" % sys.argv[0]
print "Strips a newline off the last line of a file."
sys.exit(1)
try:
# must have mode "b" (binary) to allow f.seek() with negative offset
f = open(filename, "rb")
except IOError:
print "file does not exist:", filename
sys.exit(2)
SEEK_EOF = 2
f.seek(-2, SEEK_EOF) # seek to two bytes before end of file
end_pos = f.tell()
line = f.read()
f.close()
if line.endswith("\r\n"):
trunc(filename, end_pos)
elif line.endswith("\n"):
trunc(filename, end_pos + 1)
ป.ล. ด้วยจิตวิญญาณของ "เพิร์ลกอล์ฟ" นี่เป็นวิธีแก้ปัญหางูหลามที่สั้นที่สุดของฉัน มัน slurps ไฟล์ทั้งหมดจากอินพุตมาตรฐานลงในหน่วยความจำตัดบรรทัดใหม่ทั้งหมดออกจากปลายและเขียนผลลัพธ์ไปยังเอาต์พุตมาตรฐาน ไม่กระชับเท่า Perl; คุณไม่สามารถเอาชนะ Perl สำหรับสิ่งที่รวดเร็วหากินเช่นนี้ได้
ลบ "\ n" จากการเรียกไปที่.rstrip()
และจะตัดพื้นที่สีขาวทั้งหมดออกจากจุดสิ้นสุดของไฟล์รวมถึงบรรทัดว่างหลายบรรทัด
วางนี้ใน "slurp_and_chomp.py" python slurp_and_chomp.py < inputfile > outputfile
และเรียกใช้แล้ว
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))